7

我想调用具有特定属性的方法。因此,我正在循环浏览所有程序集和所有方法,以找到具有我的属性的方法。工作正常,但是当我只有 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
        }
    }
}

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

4

3 回答 3

11

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

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

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

            MethodInfo[] methods = t.GetMethods();
            foreach (MethodInfo method in methods)
            {                    
                method.Invoke(instance, params...);    
            }
    }
于 2009-05-28T08:43:43.227 回答
5

就问题定义而不是编码而言,这让我觉得这是一个问题。

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

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

于 2009-05-28T08:50:49.500 回答
0

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

于 2012-03-17T12:29:09.397 回答