Принцип работы PropertyInfo.GetValue()?

200
18 августа 2017, 23:38

Не могу понять работу метода 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)). Что конкретно тут происходит?

Answer 1

Сначала мы получаем тип объекта: custumerOb.GetType().
Потом мы получаем все properties, описанные в этом типе: GetProperties(). Это вернет нам массив объектов класса PropertyInfo. Они относятся к описанию класса Customer, но не к экземпляру этого класса customerOb.
У класса PropertyInfo есть метод GetValue. Но мы же не можем просто получить значение свойства идя от описания класса, в котором описано это свойство. Мы должны сказать, значение свойства какого экземпляра этого класса мы хотим получить. Для этого мы и передаем в этот метод конкретный экземпляр класса: customerOb.

READ ALSO
Что происходит при замене myapp.dll на сервере?

Что происходит при замене myapp.dll на сервере?

Почему не вызывается Globalasax -> Application_Start при замене myapp

217
Кривая печать из webbrowser

Кривая печать из webbrowser

Вывожу html шаблон в элемент управления webbrowser

146
Как вообще правильно удалять строки из DataTable?

Как вообще правильно удалять строки из DataTable?

Есть dataTableПеребираю строки с помощью foreach

300
Не собирается проект VS2015

Не собирается проект VS2015

При сборке проекта ошибка:

186