Вы можете создать такой метод расширения, как этот пример кода.
public static class ClassEx
{
public static object GetValue(this MemberInfo memberInfo, object forObject)
{
switch (memberInfo.MemberType)
{
case MemberTypes.Field:
return ((FieldInfo)memberInfo).GetValue(forObject);
case MemberTypes.Property:
return ((PropertyInfo)memberInfo).GetValue(forObject);
default:
throw new NotImplementedException();
}
}
}
И использовать в своем коде вот так
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
}