【问题标题】:Invoke method by MethodInfo通过 MethodInfo 调用方法
【发布时间】:2009-05-28 08:41:56
【问题描述】:

我想调用具有特定属性的方法。 因此,我正在循环浏览所有程序集和所有方法,以找到具有我的属性的方法。工作正常,但是当我只有 MethodInfo 时如何调用某个方法。

AppDomain app = AppDomain.CurrentDomain;
Assembly[] ass = app.GetAssemblies();
Type[] types;
foreach (Assembly a in ass)
{
    types = a.GetTypes();
    foreach (Type t in types)
    {
        MethodInfo[] methods = t.GetMethods();
        foreach (MethodInfo method in methods)
        {
            // Invoke a certain method
        }
    }
}

问题是我不知道包含该特定方法的类的实例。所以我不能正确调用它,因为方法不是静态的。 如果可能,我还想避免创建此类的新实例。

【问题讨论】:

    标签: c# reflection invoke methodinfo


    【解决方案1】:

    非静态方法是特定于实例的,因此您必须实例化该类才能调用该方法。如果您有能力更改定义它的代码并且该方法不需要自己成为实例的一部分(它不访问或修改类中的任何非静态属性或方法),那么最佳实践是无论如何都要使方法静态。

    假设你不能将其设为静态,那么你需要的代码如下:

        foreach (Type t in types)
        {
                object instance = Activator.CreateInstance(t);
    
                MethodInfo[] methods = t.GetMethods();
                foreach (MethodInfo method in methods)
                {                    
                    method.Invoke(instance, params...);    
                }
        }
    

    【讨论】:

    • 其实;非静态方法是 instance 特定的。静态方法是特定于类的。
    【解决方案2】:

    这让我觉得这是一个问题定义而不是编码方面的问题。

    实例方法取决于调用它们的实例 - 调用实例方法而不关心它被调用的内容是没有意义的。 (正如马丁所说,一个不关心它被调用的实例的实例方法应该几乎总是静态的。我能想到的唯一直接例外是虚拟方法,其中实例隐式指定要使用的实现。)

    找出在你的上下文中真正意味着有一个带注释的实例方法。为什么你仍然试图调用方法?更大的图景是什么?你有什么背景?我强烈怀疑你会想要一些上下文的概念——你可以调用实例方法的对象集合。

    【讨论】:

    • 我想做的是用自定义属性标记方法,让它们可以被命令行调用。不管他们在哪里。但是我同意你的观点,在方法不是静态的多个实例上调用相同的方法是没有意义的。因此,我将在一种包含这些对象集合的管理器类中使用它,以根据参数调用特定实例的调用。我认为这会做我想要的。谢谢
    【解决方案3】:

    实际上,我认为您需要做的是创建一个现有对象的列表,然后搜索该列表。因此,当您创建这些可调用对象时,您会将它们存储到列表中(或者该列表应该是其他类型的对象列表,这些对象也具有可调用对象的描述)。然后您可以在运行时扫描列表,找到与您正在处理的事件类型匹配的列表,然后查找它的 methodInfo 并在方法信息上调用 .Invoke,假设那是您想要做的。您还需要传入适当的参数,但您可以通过创建正确类型的对象向量来做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多