【问题标题】:Is there a way of calling a Functional "Invoke" without using Reflection?有没有一种方法可以在不使用反射的情况下调用函数式“调用”?
【发布时间】:2013-11-05 06:00:21
【问题描述】:

有没有什么方法,不使用反射,在 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);
    };
}

感谢您的阅读。

【问题讨论】:

  • 您可以更加努力地提出您的问题,这样我们就可以在这里回答问题。
  • 好的,会的。我以为已经很清楚了,看来我可能弄错了。

标签: c# reflection actionscript functional-programming


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2022-08-21
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多