我想要调用有特定属性的方法。 所以,我骑自行车经过的所有组件和所有的方法来找到我的属性的方法。做工精细,但我怎么调用某个方法时,我只得到了它的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
        }
    }
}

的问题是,不知道包含一定的方法的类的实例。因此,我不能正确地调用它,因为这些方法不是一成不变的。 我也想避免创建这个类,如果可能的新实例。

有帮助吗?

解决方案

这令我的问题对问题的定义方面,而不是编码。

实例方法取决于哪个实例他们是所谓的 - 它是没有意义的呼叫,而无需关心它叫什么的一个实例方法。 (正如马丁说,这并不关心哪个实例它被称为上的实例方法应该几乎总是一成不变的。唯一直接例外,我能想到的,这是虚拟方法,这里的实例隐含指定要使用的实现。)

工作出什么是真正的办法的在你的有上下文是一个注释实例方法。为什么你想反正调用方法?什么是大局?你有什么背景?我强烈怀疑你会希望有一个背景的一些观念 - 你的对象的集合,可以的调用实例方法

其他提示

非静态方法是实例特定所以必须实例化类调用的方法。如果你必须改变它定义的代码的能力和方法不需要自己是一个实例的一部分(不访问或修改类中任何非静态的属性或方法),那么最好的做法是使方法静态反正。

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

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

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

其实,我认为你需要做的是创建现有对象的列表,然后搜索列表。所以,当你创建这些对象,可调用,你会并将其存储到列表(或者列表中应该有一些其他种类也有可调用对象的描述对象的列表)。然后你就可以在运行时扫描列表中,找到事件您正在处理的类型相匹配的一个,然后查找它的MethodInfo,并调用.Invoke的方法的信息,假设你想要做什么,多数民众赞成。您还需要在适当的参数传递,但你可以通过创建正确类型的物体的向量做到这一点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top