如何通过memberinfo访问会员的会员?

时间:2019-02-24 06:03:51

标签: 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.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类获取成员吗?

3 个答案:

答案 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
            }