Reflection - проверка всех свойств с нулевым значением имеет значения

Мне нужно пройти через все свойства в нескольких классах и проверить любые свойства с нулевым значением, чтобы увидеть, имеют ли они значение. Как мне вернуть значение, возвращаемое из свойстваInfo.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
    }
}

Ответы

Ответ 1

note Я предполагаю, что вы имеете в виду 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>.

Ответ 2

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