2

人の母親と人の父親のフィールドを含むクラス Person があります。personインスタンスのメンバから「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);
    }
4

2 に答える 2

3

あなたはそれを逆に持っています。 Invokeは のメソッドなので、変数のメソッドMethodInfoを呼び出す必要があります。そのはず:Invokemethod

Object result = method.Invoke(item);
于 2013-09-06T16:47:31.110 に答える
1

Reed Copseyの回答に追加すると、アイテムをInvokeのパラメーターとして使用できるとは思いません。

Invoke メソッドは 2 つのパラメーターを受け取ります。1 つ目はメソッドを呼び出すオブジェクト、2 つ目はメソッドのパラメーターです。

したがって、1 番目のパラメーターは Person 型である必要があり (呼び出されるメソッドは Person クラスに対して定義されているため)、2 番目のパラメーターは null である必要があります (メソッドはパラメーターを取らないため)。

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

上記のコードで必要な出力が得られることを願っています

于 2013-09-06T17:03:24.897 に答える