2010-02-01 35 views
7

Với trường hợp PropertyInfo, có thuộc tính Type, cách xác định xem đó có phải là cấu trúc không? Tôi tìm thấy có các thuộc tính như IsPrimitive, IsInterface, v.v. nhưng tôi không chắc chắn làm thế nào để yêu cầu một cấu trúc?Làm thế nào để xác định xem loại là một cấu trúc?

EDIT: Để làm rõ câu hỏi. Giả sử tôi có phương thức:

public Boolean Check(PropertyInfo pi) 
{ 
    return pi.Type.IsStruct; 
} 

Tôi phải viết gì thay vì IsStruct?

Trả lời

10

Type.IsValueType nên thực hiện thủ thuật.

(chèn ép từ here)

+0

Cảm ơn. Tôi đoán tôi cũng sẽ phải kiểm tra! IsPrimitive, nhưng điều đó nên làm các trick. –

+2

@Dejan: cũng là các nguyên thủy (như boolean) là cấu trúc. –

+0

Bạn nói đúng, bạn sẽ cần! IsPrimitive. Điều gì về một phương pháp mở rộng? : D – OregonGhost

1

đưa các ý kiến ​​về câu trả lời Antony Koch 's vào một phương pháp gia hạn:

public static class ReflectionExtensions { 
     public static bool IsCustomValueType(this Type type) {    
       return type.IsValueType && !type.IsPrimitive && type.Namespace != null && !type.Namespace.StartsWith("System."); 
     } 
    } 

nên làm việc

+0

Hãy cân nhắc xem bạn có muốn bao gồm hoặc loại trừ 'IsEnum' - nếu bạn chỉ đang tìm cấu trúc tùy chỉnh. –

1

Struct và enums (IsEnum) thuộc superset được gọi là các loại giá trị (IsValueType). Các kiểu nguyên thủy (IsPrimitive) là một tập con của cấu trúc. Có nghĩa là tất cả các kiểu nguyên thủy đều là cấu trúc nhưng không ngược lại; ví dụ, int là một kiểu nguyên thủy cũng như cấu trúc, nhưng decimal chỉ là một cấu trúc, không phải là kiểu nguyên thủy.

Vì vậy, bạn thấy thuộc tính duy nhất bị thiếu có cấu trúc. Dễ dàng viết một:

public bool IsStruct(this Type type) 
{ 
    return type.IsValueType && !type.IsEnum; 
} 
Các vấn đề liên quan