-1

Is there any way, without using Reflection, of writing something along the lines of OSteele's Functional Invoke in C#?

This means using it as in:

Action<T> MethodName = StaticUtil.Invoke<T>("MethodName", optionalCurriedArgs);

And then calling:

MethodName(objWithMethodName);

I know using a Lambda would do the trick.

What I mean, is using something along the lines of AS3's:

public static function invoke( selectedMethod : String, ... arguments ) : Function {
    var args : Array = arguments.slice();
    return function ( object : * ) : * {
        return object[ selectedMethod ].apply( object, args);
    };
}

Thank you for reading.

4

1 回答 1

1

不,在 C# 中没有明显的方法不使用反射来调用特定类的函数。充其量你可以尝试dynamic让它在运行时解决。您可以尝试使用类似的库FasterFlect来解决您的需求。

或者,如果你想要一个内置的方法,你可以做

typeof(MyObject).InvokeMember(methodName
         ,BindingFlags.Public | BindingFlags.Instance
         ,null
         ,myInstance
         ,new object[]{parameter1,parameter2})

如果我说这不是反射,那我就是在骗你。CLR 不是为您设计的,可以像 javascript 那样动态调用方法。这是进行高性能方法调用的有意识的决定。如果您需要传递函数,请使用委托。如果您的方法需要可变参数支持,您可以使用重载,或params. 如果您需要通过字符串动态调用方法:使用Dictionary<string,DelegateType>,或者如果您知道自己有一些方法并且需要绝对速度,请使用List<Tuple<string,DelegateType>>. 如果您有许多类型都响应消息,请使用Interfaces. 如果这些类不是您自己的,或者它们专门用于原语,请尝试dynamic

C# 是为标准编码实践编写的精心设计的语言。有很多选择。如果您真的需要,他们会为您提供查找成员并调用它们的工具。反射很慢,因为 CLR 被设计为首先是安全的。如果您发现自己需要大量反射动态调用,您可能需要重新考虑您的设计选择。如果您仍然找不到其他方法,您仍然可以使用缓存并Delegates使其快速。dynamic完全通过巧妙的缓存和委托完成,在最好的情况下动态几乎与本机代码一样快。

理论上,您可以创建类似于CallSite<T>DLR 中的模式来快速缓存特定呼叫站点。我在编写的动态代理中做了类似的事情,以解决无法创建指向开放泛型方法的函数指针的事实。(例如,我想要一个mydelegate.Invoke<T>(T arg))。

于 2013-11-14T16:12:11.210 回答