在运行时使用 ref 参数创建 C# 委托类型
我需要在运行时创建带有 ref 参数的委托类型。
如果我在编译时知道参数类型,我可以使用显式委托类型声明,例如:
// S is some struct / value type, e.g. int or Guid
delegate void VoidDelSRef (ref S s);
Type td = typeof (VoidDelSRef);
该类型 td
用于创建 C#4 表达式树,该树被编译为一名代表。
由于表达式树中的代码修改了参数 s
,因此我需要通过引用传递 s
。
我必须支持任何类型 S
,因此我无法使用显式委托类型声明,因为我只有 Type ts = typeof (S)
及其 ref
类型 Type tsr = ts.MakeByRefType ()
。
我尝试使用 Expression.GetActionType (tsr)
,但它不允许 ref
类型。
如何在运行时使用 ref
参数构建委托?
I need to create a delegate type with a ref
parameter at runtime.
If I knew the parameter type(s) at compile time, I could use an explicit delegate type declaration, for example:
// S is some struct / value type, e.g. int or Guid
delegate void VoidDelSRef (ref S s);
Type td = typeof (VoidDelSRef);
That type td
is used to create a C#4 expression tree, which is compiled into a delegate.
Since the code in my expression tree modifies the parameter s
, I need to pass s
by reference.
I have to support any type S
, so I can't use an explicit delegate type declaration, because I only have Type ts = typeof (S)
and its ref
type Type tsr = ts.MakeByRefType ()
.
I tried to use Expression.GetActionType (tsr)
, but it does not allow ref
types.
How do I build a delegate with ref
parameters at runtime ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在 .NET 4 中,您可以使用
Expression.GetDelegateType
方法。与GetActionType
不同,它可以很好地处理ByRef
类型。例如:
如果您使用的是.NET 3.5,则此方法不可用。如果您想复制其功能,我建议您查看其实现(使用反编译器)。它没有太多的依赖;这绝对是可行的。
In .NET 4, you can use the
Expression.GetDelegateType
method. UnlikeGetActionType
, it works fine withByRef
types.E.g.:
If you are on .NET 3.5, this method is not available. I recommend taking a look at its implementation (with a decompiler) if you want to replicate its functionality. It doesn't have too many dependencies; it's definitely doable.