Как получить значение свойства из объекта класса во время выполнения, используя отражение
У меня есть класс что-то вроде ниже:
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);
Не забудьте обработать нулевые значения и т. Д.