Не могу понять работу метода PropertyInfo.GetValue().
Мне было необходимо проверить все свойства объекта customerOb (см. код ниже) на null и вернуть true в случае успеха. Я это сделал, используя данный пост, но не могу понять это самое "как" все работает.
public class Customer
{
public string Surname { get; set; }
public string Name { get; set; }
public CustomerEdit CustomerEdit { get; set; }
}
class Program
{
static void Main()
{
var custumerOb = new Customer();
var isAllPropertiesNull = custumerOb.GetType()
.GetProperties()
.Select(pi => pi.GetValue(custumerOb))
.All(p => p == null);
}
}
Значит:
custumerOb.GetType() - это понятно
.GetProperties() - это понятно
.Select(pi => pi.GetValue(custumerOb)) - это НЕ понятно
Было бы понятно если GetValue() не принимал параметр:
.Select(pi => pi.GetValue())
А то мы как бы получаем очередное свойство pi и чтобы узнать его значение передаем в (его) метод GetValue() объект чьим свойством он является.
Я запутался. Объясните пожалуйста выражение .Select(pi => pi.GetValue(custumerOb)). Что конкретно тут происходит?
Сначала мы получаем тип объекта: custumerOb.GetType().
Потом мы получаем все properties, описанные в этом типе: GetProperties(). Это вернет нам массив объектов класса PropertyInfo. Они относятся к описанию класса Customer, но не к экземпляру этого класса customerOb.
У класса PropertyInfo есть метод GetValue. Но мы же не можем просто получить значение свойства идя от описания класса, в котором описано это свойство. Мы должны сказать, значение свойства какого экземпляра этого класса мы хотим получить. Для этого мы и передаем в этот метод конкретный экземпляр класса: customerOb.
Продвижение своими сайтами как стратегия роста и независимости