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(); } }
3 Réponses :
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: Dans cette situation, obj est l'objet que vous obtenez le député de. P> p>
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);
}
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 }