Delegate.CreateDelegate没有原型

时间:2009-08-20 20:31:59

标签: c# reflection delegates

现在,我必须这样做

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,它将特定类型作为参数。

由于

1 个答案:

答案 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。