2012-01-20 25 views
111

Để kiểm tra xem một Type (propertyType) là nullable, Tôi đang sử dụng:cách chính xác để kiểm tra xem một loại là Nullable

bool isNullable = "Nullable`1".Equals(propertyType.Name) 

Có một số cách mà tránh sử dụng dây ma thuật?

+1

Kiểm tra xem một loại là 'Nullable '? Nếu có, hãy xem http://stackoverflow.com/questions/374651/how-to-check-if-an-object-is-nullable –

Trả lời

226

Tuyệt đối - sử dụng Nullable.GetUnderlyingType:

if (Nullable.GetUnderlyingType(propertyType) != null) 
{ 
    // It's nullable 
} 

Lưu ý rằng đây sử dụng lớp tĩnh phi generic System.Nullable chứ không phải là struct generic Nullable<T>.

Cũng lưu ý rằng điều đó sẽ kiểm tra xem nó đại diện cho một cụ (đóng cửa) nullable kiểu giá trị ... nó sẽ không hoạt động nếu bạn sử dụng nó trên một generic loại, ví dụ

public class Foo<T> where T : struct 
{ 
    public Nullable<T> Bar { get; set; } 
} 

Type propertyType = typeof(Foo<>).GetProperty("Bar").PropertyType; 
// propertyType is an *open* type... 
+0

Tuyệt vời! Tôi sẽ chấp nhận ngay khi tôi có thể! –

+0

Có vẻ như bạn đã tìm thấy một sự bất đồng rất thú vị giữa đặc điểm kỹ thuật (liên kết của bạn trong dòng đầu tiên) và hành vi thực tế. Đối với đối tượng 'propertyType' của bạn từ dòng cuối cùng là một ví dụ ngược. Ý tôi là 'Nullable.GetUnderlyingType (propertyType)' không ** không ** trả về null (nó trả về 'T') mặc dù' propertyType' là một kiểu _open_ generic ('propertyType.ContainsGenericParameters'). Tôi đã thử nghiệm một chút, và nó trông giống như một kiểu generic mở với '' Nullable'1'' là OK _unless_ kiểu tham số chính xác là 'T' từ' typeof (Nullable <>). GetGenericArguments() [0] '. –

+0

Bạn có ý nghĩa gì bởi "nó trả về T của bạn"? Điều này nghe có vẻ như đáng để thêm vào như một câu hỏi mới, với một ví dụ ngắn nhưng đầy đủ. –

24

Sử dụng mã sau đây để xác định xem đối tượng Loại có đại diện cho loại không thể xóa. Hãy nhớ rằng mã này luôn trả về false nếu đối tượng Type được trả về từ một cuộc gọi đến GetType.

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) {…} 

giải thích tại bên dưới liên kết MSDN:

http://msdn.microsoft.com/en-us/library/ms366789.aspx

Hơn nữa, có một cuộc thảo luận tương tự tại này SO QA:

How to check if an object is nullable?

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