我需要在运行时创建一个带有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
参数构建委托?
答案 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,则此方法不可用。如果你想复制它的功能,我建议看一下它的实现(用反编译器)。它没有太多的依赖关系;这绝对可行。