有没有办法在不使用Reflection的情况下调用Functional“Invoke”?

时间:2013-10-26 00:15:59

标签: c# reflection actionscript functional-programming

有没有办法不使用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);
    };
}

感谢您的阅读。

1 个答案:

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