2010-01-20 35 views
17

Tôi phải lặp qua tất cả các thuộc tính trong một vài lớp và kiểm tra bất kỳ thuộc tính nullable nào để xem chúng có giá trị hay không. Làm cách nào để truyền giá trị được trả về từ thuộc tính propertyInfo.GetValue() đến một kiểu nullable chung để tôi có thể kiểm tra thuộc tính HasValue?Reflection - kiểm tra tất cả các thuộc tính nullable có giá trị

Mã snipped cho ngắn gọn:

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

bạn không thể làm gì nếu (propInfo.GetValue (this, null)! = Null)? Hay bạn muốn sử dụng HasValue một cách rõ ràng? –

Trả lời

29

lưu ý tôi giả sử bạn có nghĩa là Nullable<T>; nếu bạn có nghĩa là Nullable<T> hoặc một tham chiếu, thì bạn đã có nó: object (từ GetValue) - chỉ cần kiểm tra null.

Trong trường hợp Nullable<T>; bạn không thể truyền sang một loại không chung chung (trừ object) - nhưng bạn không cần; chỉ cần kiểm tra xem nó có phải là null không, vì trống Nullable<T> được đóng hộp thành nullGetValue trả lại object (do đó nó đóng hộp giá trị).

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>) 
    } 
} 

Để làm rõ, Nullable là một lớp tiện ích tĩnh đó là hoàn toàn tách biệt đến Nullable<T> struct; vì vậy bạn không bỏ qua Nullable. Khi điều đó xảy ra, Nullable tồn tại để cung cấp những thứ như GetUnderlyingType giúp bạn làm việc với Nullable<T>.

+0

Câu trả lời hay, cảm ơn. – Paddy

+0

Tham chiếu mã nguồn: http://referencesource.microsoft.com/#mscorlib/system/nullable.cs,134 –

0

Vì bạn đã thiết lập thuộc tính là loại Nullable<something>, bạn biết giá trị có thuộc tính HasValue - để tìm thuộc tính đó bằng cách phản ánh và nhận giá trị của thuộc tính.

Các vấn đề liên quan