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

17

Мне нужно пройти через все свойства в нескольких классах и проверить любые свойства с нулевым значением, чтобы увидеть, имеют ли они значение. Как мне вернуть значение, возвращаемое из свойства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
    }
}
    
задан Paddy 20.01.2010 в 13:11
источник
  • ___ qstnhdr ___ Reflection - проверка всех свойств с нулевым значением имеет значения ___ commmment2034945 ___ Хороший ответ, спасибо. ___ commmment2034860 ​​___ вы не можете просто сделать, если (propInfo.GetValue (это, null)! = null)? Или вы хотите явно использовать HasValue? ___ commmment48017707 ___ Ссылка на исходный код: sourcesource.microsoft.com/#mscorlib/system/nullable.cs,134 ___ qstntxt ___ <div class="post-text" itemprop="text"> <p> Мне нужно пройти через все свойства в нескольких классах и проверить любые свойства с нулевым значением, чтобы увидеть, имеют ли они значение. Как мне вернуть значение, возвращаемое из свойстваInfo.GetValue (), в общий тип с нулевым значением, чтобы я мог проверить свойство HasValue? </P> <p> Код сокращен для краткости: </p> %pre%     </DIV> ___ commmment86203985 ___ @ t3chb0t Я имел в виду это как написанное; есть два очень разных значения nullable, и я разъяснял, что для одного из них это автоматически тривиально, и на самом деле оба они могут (через специальные правила бокса) обрабатываться таким же образом - и: далее: путь ОП пытается это сделать (что предполагает использование более общей версии Nullable-T), не существует и не может существовать. ___ answer2101206 ___ <div class="post-text" itemprop="text"> <p> note Я предполагаю, что вы имеете в виду %code% ; если вы имеете в виду %code% или ссылку, то у вас уже есть: %code% (from %code% ) - просто проверьте %code% . </p> <p> В случае %code% ; вы не можете использовать один не общий тип (кроме %code% ), но вам не нужно; просто проверьте, что это не %code% , так как пустой %code% помечен в поле %code% , а %code% возвращает %code% (следовательно, он устанавливает значение). </p> %pre% <p> Чтобы уточнить, %code% - это статический класс утилиты, который <strong> полностью разделен </strong> на %code% struct; так что вы вообще не набрасываете %code% . Как это бывает, %code% существует для предоставления таких вещей, как %code% , которые помогают вам работать с %code% . </P>     </DIV> ___ commmment86202466 ___ В первом предложении вы дважды используете Nullable <T> ... такого рода не имеет смысла ... вы имели в виду просто сказать Nullable & Nullable <T>? ___ answer2101210 ___ <div class="post-text" itemprop="text"> <p> Поскольку вы установили, что свойство имеет тип %code% , вы знаете <em> его значение </em> имеет свойство %code% - поэтому найдите это свойство путем отражения и получите его значение. </p >     </DIV> ___ –  Waleed Al-Balooshi 20.01.2010 в 13:18

2 ответа

29

note Я предполагаю, что вы имеете в виду Nullable<T> ; если вы имеете в виду Nullable<T> или ссылку, то у вас уже есть: object (from 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> struct; так что вы вообще не набрасываете Nullable . Как это бывает, Nullable существует для предоставления таких вещей, как GetUnderlyingType , которые помогают вам работать с Nullable<T> .

    
ответ дан Marc Gravell 20.01.2010 в 13:15
источник
  • Хороший ответ, спасибо. –  Paddy 20.01.2010 в 13:33
  • Ссылка на исходный код: sourcesource.microsoft.com/#mscorlib/system/nullable.cs,134 –  Frison Alexander 29.04.2015 в 17:39
  • В первом предложении вы дважды используете Nullable <T> ... такого рода не имеет смысла ... вы имели в виду просто сказать Nullable & Nullable <T>? –  t3chb0t 01.04.2018 в 13:39
  • @ t3chb0t Я имел в виду это как написанное; есть два очень разных значения nullable, и я разъяснял, что для одного из них это автоматически тривиально, и на самом деле оба они могут (через специальные правила бокса) обрабатываться таким же образом - и: далее: путь ОП пытается это сделать (что предполагает использование более общей версии Nullable-T), не существует и не может существовать. –  Marc Gravell♦ 01.04.2018 в 15:11
0

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

    
ответ дан AakashM 20.01.2010 в 13:15
источник