Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过memberinfo访问成员的成员?_C#_Reflection - Fatal编程技术网

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
            }