C# 如何通过memberinfo访问成员的成员?
我的代码如下所示:C# 如何通过memberinfo访问成员的成员?,c#,reflection,C#,Reflection,我的代码如下所示: 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.
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获得A的成员吗?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是从中获取成员的对象。MemberInfo获取类中所有类型的成员。因此,您必须向下筛选它的方法,然后找到名为a的方法
您可以像下面的示例代码一样创建一个扩展方法
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
}
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
}