Отражение - проверьте, что все обнуляемые свойства имеют значения - PullRequest
18 голосов
/ 20 января 2010

Мне нужно пройтись по всем свойствам в нескольких классах и проверить любые обнуляемые свойства, чтобы увидеть, имеют ли они значение. Как преобразовать значение, возвращаемое из propertyInfo.GetValue (), в универсальный обнуляемый тип, чтобы я мог проверить свойство HasValue?

Код откорректирован для краткости:

foreach (PropertyInfo propInfo in this.GetType().GetProperties())
{
    if (<Snip: Check to see that this is a nullable type>)                                                                      
    {
           //How do i cast this properly in here to allow me to do:
           if(!((Nullable)propInfo.GetValue(this, null)).HasValue)
                  //More code here
    }
}

Ответы [ 2 ]

31 голосов
/ 20 января 2010

примечание Я предполагаю, что вы имеете в виду Nullable<T>; если вы имеете в виду Nullable<T> или ссылку, то у вас уже есть: object (из GetValue) - просто проверьте null.

В случае Nullable<T>; вы не можете привести к единственному неуниверсальному типу (кроме object) - но вам это не нужно; просто убедитесь, что это не null, поскольку пустое Nullable<T> упаковано в null, а GetValue возвращает object (следовательно, оно упаковывает значение).

if(Nullable.GetUnderlyingType(propInfo.PropertyType) != null) {
    // it is a Nullable<T> for some T
    if(propInfo.GetValue(this, null) != null) {
        // it has a value (it isn't an empty Nullable<T>)
    }
}

Для пояснения, Nullable - это статический служебный класс, который полностью отделен от структуры Nullable<T>; так что вы вообще не бросаете на Nullable. Как это бывает, Nullable существует, чтобы обеспечить такие вещи, как GetUnderlyingType, который поможет вам работать с Nullable<T>.

0 голосов
/ 20 января 2010

Поскольку вы установили, что свойство имеет тип Nullable<something>, вы знаете, его значение имеет свойство HasValue, поэтому найдите это свойство по отражению и получите его значение.

...