现在,我必须这样做
private delegate void set(int obj); //declare the prototype
...
Delegate delegate1 = Delegate.CreateDelegate(typeof(set), new testObject(), props[0].GetSetMethod());
((set)delegate1)(1);
有没有一种方法可以在没有该原型的情况下使用CreateDelegate并使用任何参数调用它? GetSetMethod()返回一个非常具体的MethodInfo,它将特定类型作为参数。
由于
答案 0 :(得分:2)
在.NET 3.5中,您可以使用Expression.GetActionType
:
Type setterType = Expression.GetActionType(props[0].PropertyType);
Delegate delegate1 = Delegate.CreateDelegate(setterType,
new testObject(), props[0].GetSetMethod()
);
或者如果你想要一个开放的委托(即任何testObject
个实例,而不是绑定到新的实例):
Type setterType = Expression.GetActionType(
props[0].DeclaringType, props[0].PropertyType);
Delegate delegate1 = Delegate.CreateDelegate(setterType,
null, props[0].GetSetMethod()
);
然而;请注意,您必须通过DynamicInvoke
使用这些代理,这比通过Invoke
使用完全类型的代理要慢得多。
另一个选项(针对此场景)是绑定到一个需要object
的委托,并使用内部委托 - 通过一些fancy generics,一个已编译的{ {1}}或自定义IL。