C# 没有原型的Delegate.CreateDelegate
现在,我必须这么做C# 没有原型的Delegate.CreateDelegate,c#,reflection,delegates,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); 有没有一种方法可以在没有原型的情况下创建委托并使用任何参数调用它?GetSetMethod()返回一
private delegate void set(int obj); //declare the prototype
...
Delegate delegate1 = Delegate.CreateDelegate(typeof(set), new testObject(), props[0].GetSetMethod());
((set)delegate1)(1);
有没有一种方法可以在没有原型的情况下创建委托并使用任何参数调用它?GetSetMethod()返回一个非常特定的MethodInfo,该MethodInfo将特定类型作为参数
感谢您在.NET 3.5中使用
表达式。GetActionType
:
Type setterType = Expression.GetActionType(props[0].PropertyType);
Delegate delegate1 = Delegate.CreateDelegate(setterType,
new testObject(), props[0].GetSetMethod()
);
或者,如果您想要一个打开的委托(即到任何testObject
实例,而不是绑定到新实例):
但是,;请注意,您必须通过DynamicInvoke
使用这些委托,这比通过Invoke
使用全类型委托慢得多
另一个选项(在这种情况下)是绑定到接受
对象的委托,并在委托内部使用强制转换,可以通过一些编译的表达式或自定义IL。他也可以将类型(操作)
传递到CreateDelegate
:)以上是因为我不想为每种可能的类型(int、double、…用户定义的类型)编写委托原型。当直接代理需要约15毫秒时,需要5000毫秒以上。我希望直接调用委托能够自动转换为Set方法所需的类型。@280Z28-我有意将其保留在最一般的情况下,我们只有一个PropertyInfo。这是我前面的问题。只是在探索另一种选择。顺便说一下,道具[0]是一个PropertyInfo
Type setterType = Expression.GetActionType(
props[0].DeclaringType, props[0].PropertyType);
Delegate delegate1 = Delegate.CreateDelegate(setterType,
null, props[0].GetSetMethod()
);