我的代码如下:
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();
}
}
我声明了A类和B类,并获得了关于b.a
的MemberInfo。现在我可以通过MemberInfo类获取成员吗?
答案 0 :(得分:0)
MemberInfo对象通常实际上是三个子类之一:FieldInfo,PropertyInfo或MethodInfo。由于这些是根本不同的构造,因此您需要以不同的方式访问它们。您可以执行以下操作:
switch (memberInfo)
{
case FieldInfo fieldInfo:
return fieldInfo.GetValue(obj);
case PropertyInfo propertyInfo:
return propertyInfo.GetValue(obj);
case MethodInfo methodInfo:
return methodInfo.Invoke(obj, params...)
}
在这种情况下,obj是您从中获取成员的对象。
答案 1 :(得分:0)
MemberInfo获取类中所有类型的成员。因此,您将不得不过滤其方法,然后找到名称为a
的方法。
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);
}
答案 2 :(得分:0)
您可以创建类似此示例代码的扩展方法。
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
}