MethodInfo调用方法

时间:2009-05-28 08:41:56

标签: c# reflection invoke methodinfo

我想调用具有特定属性的方法。 所以我循环遍历所有程序集和所有方法以使用我的属性查找方法。工作正常,但是当我得到它的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
        }
    }
}

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

3 个答案:

答案 0 :(得分:11)

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

假设您无法使其成为静态,那么您需要的代码如下:

    foreach (Type t in types)
    {
            object instance = Activator.CreateInstance(t);

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

答案 1 :(得分:5)

这使我在问题定义方面成为一个问题,而不是编码。

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

在您的上下文中找出它真正意味着的内容,以便有一个带注释的实例方法。你为什么要尝试调用方法?大局是什么?你有什么背景?我强烈怀疑你会想要一些上下文的概念 - 你可以调用实例方法的对象集合。

答案 2 :(得分:0)

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