使用反射从类型成员调用方法

时间:2013-09-06 16:45:01

标签: c# .net reflection methodinfo

我有一个人类,其中包含该人的母亲和该人的父亲的字段。我想从人员实例中调用一个名为“WriteName”的方法。

我怎样才能用反射做到这一点?

Person child = new Person {name = "Child"} ; // Creating a person
child.father = new Person {name = "Father"}; // Creating a mother for the person
child.mother = new Person { name = "Mother" }; // Creating a father for the person
child.ExecuteReflection();

public class Person
{
    public int ID { get; set; }
    public string name { get; set; }
    public Person mother { get; set; }
    public Person father { get; set; }

    public void WriteName()
    {
        Console.WriteLine("My Name is {0}", this.name);
    }

    public void ExecuteReflection()
    {
        // Getting all members from Person that have a method called "WriteName"
        var items = this.GetType().GetMembers(BindingFlags.Instance | BindingFlags.NonPublic)
                        .Where(t => t.DeclaringType.Equals(typeof(Person)))
                        .Where(p => p.DeclaringType.GetMethod("WriteName") != null);



        foreach (var item in items)
        {
            MethodInfo method = item.DeclaringType.GetMethod("WriteName"); // Getting the method by name
            // Object result = item.Invoke(method); // trying to invoke the method, wont compile
        }


    }

我想有这个输出:

"My name is mother"
"My Name is father"

编辑:

我的更改后的正确代码是:

var items = this.GetType().GetFields(BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.NonPublic)
                        .Where(t => t.FieldType.Equals(typeof(Person)))
                        .Where(p => p.FieldType.GetMethod("WriteName") != null);



    foreach (var item in items)
    {
        MethodInfo method = item.DeclaringType.GetMethod("WriteName"); 
        Object result = method.Invoke((Person)item.GetValue(this), null);
    }

2 个答案:

答案 0 :(得分:3)

你倒退了。 InvokeMethodInfo上的一种方法,因此您需要在Invoke变量上调用method方法。它应该是:

Object result = method.Invoke(item);

答案 1 :(得分:1)

添加到Reed Copsey的答案我不认为你可以将item作为Invoke的参数。

Invoke方法接受2个参数,首先是应该调用方法的对象,第二个是方法的参数。

所以第一个参数应该是Person类型(因为调用的方法是为Person类定义的),第二个参数应该是null(因为该方法不带任何参数)

Object result=method.Invoke(this,null);

我希望上面的代码能够提供您所需的输出