0
votes

Comment accéder au membre du membre de MemberInfo?

Mon code comme ci-dessous:

    public static void Main()
    {
        B i=new B();
        MemberInfo[] mis = i.GetType().GetMembers();
        if (mis.FirstOrDefault(c => c.Name == "a") != null)
        {
            MemberInfo mi = mis.FirstOrDefault(c => c.Name == "a");

            // Now I want to access member of a via mi
        }
    }

    public class A
    {
        public int i { get; set; }
        public void test() { }
    }

    public class B
    {
        public A a { get; set; }
        public B()
        {
            a = new A();
        }
    }


0 commentaires

3 Réponses :


0
votes

Un objet membreInfo est généralement l'une des trois sous-classes: Fieldinfo, PropertyInfo ou MethodInfo. Étant donné que ce sont des constructions fondamentalement différentes, vous devez y accéder différemment. Vous pouvez faire quelque chose comme: xxx

Dans cette situation, obj est l'objet que vous obtenez le député de.


0 commentaires

0
votes

membreInfo obtient tous les types de membres dans une classe. Donc, vous devrez filtrer à ses méthodes, puis trouver la méthode avec nom A code>.

MemberInfo miA = i.GetType().GetMembers().FirstOrDefault(mi => mi.MemberType==MemberTypes.Method && mi.Name == "a");

// Now start using miA for whatever you need
// For example, iterate all of its parameters
foreach ( ParameterInfo pi in ((MethodInfo) mi).GetParameters() )
{
    Display(indent+1, "Parameter: Type={0}, Name={1}", pi.ParameterType, pi.Name);
}


0 commentaires

1
votes

Vous pouvez créer une méthode d'extension comme ce code exemple.

B i = new B();
            i.a = new A();
            i.a.i = 10;
            MemberInfo[] mis = i.GetType().GetMembers();
            if (mis.FirstOrDefault(c => c.Name == "a") != null)
            {
                MemberInfo mi = mis.FirstOrDefault(c => c.Name == "a");

                A test = (A)mi.GetValue(i);

                // handle A object here
            }


0 commentaires