有没有办法不使用Reflection ,在C#中写OSteele's Functional Invoke的内容?
这意味着在:
中使用它Action<T> MethodName = StaticUtil.Invoke<T>("MethodName", optionalCurriedArgs);
然后致电:
MethodName(objWithMethodName);
我知道使用Lambda可以解决问题。
我的意思是,使用AS3的一些东西:
public static function invoke( selectedMethod : String, ... arguments ) : Function {
var args : Array = arguments.slice();
return function ( object : * ) : * {
return object[ selectedMethod ].apply( object, args);
};
}
感谢您的阅读。
答案 0 :(得分:1)
没有。在没有使用Reflection来调用特定类的函数的情况下,C#中没有明显的方法。最好你可以尝试dynamic
并在运行时解决它。您可以尝试使用FasterFlect
等库来解决您的需求。
或者,如果你想要一个内置的方法,你可以做
typeof(MyObject).InvokeMember(methodName
,BindingFlags.Public | BindingFlags.Instance
,null
,myInstance
,new object[]{parameter1,parameter2})
如果我说这不是反思,我会骗你的。 CLR不是为您设计的,就像javascript一样动态调用方法。这是一个有意识地做出高性能方法调用的决定。如果需要传递函数,请使用Delegates。如果您的方法需要变量参数支持,则可以使用重载或params
。如果需要通过字符串动态调用方法:
使用Dictionary<string,DelegateType>
或者如果您知道有几种方法并且需要绝对速度,请使用List<Tuple<string,DelegateType>>
。如果您有许多类型都响应消息,请使用Interfaces
。如果这些类不是您自己的,或者它们专门用于原语,请尝试dynamic
。
C#是为标准编码实践编写的精心设计的语言。有很多选择。如果你真的需要他们为你提供工具来查找成员并调用它们。反思很慢,因为CLR的设计首先是安全的。如果您发现自己需要大量的反射动态调用,则可能需要重新考虑您的设计选择。如果你仍然找不到其他方法,你仍然可以使用缓存和Delegates
来快速完成。 dynamic
完全由聪明的缓存和委托完成,在最好的情况下,动态几乎与本机代码一样快。
理论上,您可以在DLR中创建类似CallSite<T>
的模式,以快速缓存特定的呼叫站点。我在动态代理中做了类似的事情,我写的是为了解决无法创建指向开放泛型方法的函数指针的事实。 (例如,我想要mydelegate.Invoke<T>(T arg)
)。