在运行时使用ref参数创建C#委托类型

时间:2011-04-06 17:13:54

标签: dynamic parameters delegates pass-by-reference

我需要在运行时创建一个带有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参数构建委托?

1 个答案:

答案 0 :(得分:2)

在.NET 4中,您可以使用Expression.GetDelegateType方法。与GetActionType不同,它适用于ByRef类型。

E.g:

// void MyDelegate(ref int arg)
var delType = Expression.GetDelegateType(typeof(int).MakeByRefType(), 
                                         typeof(void));

如果您使用的是.NET 3.5,则此方法不可用。如果你想复制它的功能,我建议看一下它的实现(用反编译器)。它没有太多的依赖关系;这绝对可行。