Как я могу получить доступ к члену пользователя по memberinfo? - PullRequest
0 голосов
/ 24 февраля 2019

мой код, как показано ниже:

    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 и получил MemberInfo около b.a.Теперь я могу получить член через класс MemberInfo?

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

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);
}
.
0 голосов
/ 24 февраля 2019

Вы можете создать такой метод расширения, как этот пример кода.

 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
            }
0 голосов
/ 24 февраля 2019

Объект 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 - это объект, от которого вы получаете член.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...