Как получить значение свойства из объекта класса во время выполнения, используя отражение

У меня есть класс что-то вроде ниже:

Class A : B<C>
{
    public A(C entity):base(entity)
    {}
}

abstract class B<T>
{
    public B(T entity)
        {
            Entity = entity;
        }

        public T Entity { get; private set; }
}

Class C: D
{
    public string prop2{get;set;}
}
Class D
{
    public string prop1{get;set;}
}
 Main()
 {
 A obj = new A(new C());
 obj.GetType().GetProperty("prop1",  BindingsFlag.Instance|BindingsFlag.FlatteredHierarchy)//  is null


 }

У меня есть объект класса А. Я хочу получить значение свойства от этого объекта во время выполнения.

Я пытаюсь с

obj.GetType().GetProprty("propertyName", 
                         BindingsFlag.FlattenHierarchy).GetValue(obj, null);

Однако GetProprty() возвращает null, так как это свойство объявлено в классе D или C.

Может кто-нибудь подсказать, пожалуйста, как этого добиться?

Заранее спасибо.

1 ответ

Решение
GetType().GetProperty("propertyName", BindingsFlag.FlattenHierarchy)
         .GetValue(obj, null);

Вы пропускаете флаг привязки, который указывает, получает ли экземпляр экземпляр или статическое свойство:

 BindingsFlag.FlattenHierarchy | BindingsFlag.Instance

В соответствии с флагом MSDN BindingsFlag.Instance или же BindingsFlag.Static Для получения ненулевых значений необходимо указать explicity:

Вы должны указать либо BindingFlags.Instance, либо BindingFlags.Static, чтобы получить возврат.

Более того, public свойства исключены по умолчанию. Так что если ваша собственность public вам нужно указать дополнительный флаг:

BindingsFlag.FlattenHierarchy | BindingsFlag.Instance | BindingsFlag.Public

Примечания:

Укажите BindingFlags.Public, чтобы включить в поиск общедоступные свойства.

Если собственность в базе является частной, FlattenHierarchy не буду перечислять это:

(...) частные статические члены в унаследованных классах не включены. Если это ваш случай, я боюсь, что вам придется вручную перемещаться по базовому классу и искать это свойство.

Убедитесь также, что имя свойства является действительным и существует.

РЕДАКТИРОВАТЬ: После вашего редактирования я вижу проблему. Ваш класс A не является подклассом класса D (вы хотите получить свойство из класса D). Вот почему получение значения свойства не работает таким образом. Вам необходимо выполнить следующие шаги:

// get entity prop value
var entityValue =
    (obj.GetType()
        .GetProperty("Entity", 
           BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.Public)
        .GetValue(obj));
// get prop value
var prop1Value =
    entityValue.GetType()
               .GetProperty("prop1", 
                  BindingFlags.FlattenHierarchy | 
                  BindingFlags.Instance | 
                  BindingFlags.Public)
               .GetValue(entityValue);

Не забудьте обработать нулевые значения и т. Д.

Другие вопросы по тегам