【问题标题】:Method for executing methods with any signature执行具有任何签名的方法的方法
【发布时间】:2012-04-30 12:06:13
【问题描述】:

是否有可能实现一个方法,该方法将方法名称和方法调用的参数集作为参数,执行方法并返回从方法执行中获得的返回值?

此方法应该用于调用具有任意数量和类型的参数以及任何返回类型的方法。

我知道这可以使用反射来实现,但我很感兴趣,如果存在不同的方法,它对性能的影响比使用反射要小。

后期编辑: 我需要实现这样的方法,因为我有一个包含许多不同方法的类,这些方法具有不同的方法签名,但大多数都是相同的格式:

{    
  //code block 1
}
using (SomeObject obj = InitializeObject(){
   ...
   //some operations
   ...
}
{
   //code block 2
}

were code block 1code block 2 是相同的,只有 using 块中的部分不同。 我只想使用一种包含通用代码块的方法,并为从一种方法到另一种方法不同的部分调用不同的方法。 我尝试使用反射,但它会以明显的方式减慢应用程序的速度,所以我不会使用它。

【问题讨论】:

  • Reflection只知道方法名的做事方式……你试过这个发现太慢了吗?
  • @Jon Skeet - 是的,我确实尝试过使用反射,但它显着降低了我的应用程序的速度。
  • 您应该提供更多关于应用程序性质的数据,具体取决于您可以使用的数据,例如泛型、表达式等或充分设计系统。鉴于您的问题过于笼统,唯一的可能就是 JonSkeet 所说的反思

标签: c# reflection methods method-signature


【解决方案1】:

抱歉,如果您将方法名称作为字符串 -> .net 反射是要走的路。

【讨论】:

  • 我拥有的不仅仅是方法名称,应该执行的方法也在我的代码中。我试图在一个方法中保留大量方法的共同行为,该方法会调用不同的部分,这将保留在较小的方法中。
【解决方案2】:

没有时间研究细节,但将 System.Reflection 与 Delegate.DynamicInvoke 结合使用可能会让您有所收获。

【讨论】:

    【解决方案3】:

    您可以利用 .NET 4.0 中的最新 DLR 功能

    查看impromptuinterface 项目及其后期绑定功能。

    特别是 InvokeMemberInvokeMemberAction 方法。这些比反射快 2 到 4 倍。

    【讨论】:

    • 谢谢你的建议,但我想在 .NET Framework 中使用“嵌入”的东西
    • 我明白了,在这种情况下,您必须坚持反射或自己实现即兴功能子集。
    【解决方案4】:

    这样的事情应该可以工作......

    public static string ExecMethodByName
        (string typeName, string methodName, string stringParam)
    {
        Type t = Type.GetType(typeName);
    
        String s = (String)t.InvokeMember(
                        methodName,
                        BindingFlags.InvokeMethod | BindingFlags.Public | 
                            BindingFlags.Static,
                        null,
                        null,
                        new Object[] { stringParam });
    
        return s;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      相关资源
      最近更新 更多