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
}