MethodInfo调用方法

app*_*rat 7 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ris 11

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

假设你不能使它静态,那么你需要的代码如下:

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

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


Jon*_*eet 5

这在问题定义而不是编码方面是一个问题.

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

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