2010-02-18 39 views
7

Đối với một số Type, có một tài sản IsClass, nhưng làm thế nào để biết một Type là một cấu trúc?Làm thế nào để xác định xem một loại là một cấu trúc tùy chỉnh?

Xin lỗi, tôi phải thêm một số thông tin khác.

  1. Tôi đang sử dụng C#.
  2. Mặc dù IsValueType là điều kiện cần thiết, rõ ràng là không đủ. Đối với một số nguyên cũng là một loại giá trị.
+0

ngôn ngữ lập trình nào? –

+0

bản sao có thể có của [Cách quyết định Kiểu là cấu trúc tùy chỉnh?] (Http://stackoverflow.com/questions/2296288/how-to-decide-a-type-is-a-custom-struct) – nawfal

Trả lời

1

Nếu đó là một kiểu giá trị (ví dụ, một struct), sử dụng Type.IsValueType.

1

Bạn có thể sử dụng IsValueType.

3

Nếu bạn đang nói về C#, bạn có thể sử dụng thuộc tính IsValueType.

-1

sử dụng này:

x.GetType().IsValueType(); 

Từ sự giúp đỡ:

Loại :: IsValueType tài sản Gets một giá trị nêu rõ Type là một loại giá trị. Các loại giá trị là các kiểu được biểu diễn dưới dạng chuỗi các bit; các kiểu giá trị không phải là các lớp hoặc các giao diện. Các kiểu giá trị được gọi là "cấu trúc" trong một số ngôn ngữ lập trình. Enums là trường hợp đặc biệt của các loại giá trị.

+0

Các loại có ý nghĩa khác nhau khi áp dụng cho vị trí lưu trữ hơn khi áp dụng cho đối tượng heap. Dưới mui xe, mọi loại giá trị đều có loại heap được liên kết. Việc truyền một loại giá trị cho 'Đối tượng' hoặc đến một giao diện mà nó triển khai sẽ tạo một đối tượng heap mới có các trường được sao chép từ thể hiện kiểu giá trị đang được truyền. Việc gọi 'GetType' trên một kiểu giá trị sẽ đưa nó vào' Object' trước, vì các kiểu giá trị không có trường loại-destrictor được yêu cầu bởi 'GetType'. – supercat

0

Vậy thì, tôi đoán cho yêu cầu của bạn thì đây đến gần:

bool isStruct = myType.IsValueType && !myType.IsPrimitive; 

nhưng vẫn DateTime không được bao phủ bởi đó chẳng hạn. Có thể bạn sẽ phải thêm các loại khác mà bạn muốn loại trừ theo cách thủ công.

+2

Ngày giờ cho kết quả đúng với mã này. Đó là enums rằng nó không xử lý một cách chính xác. –

10
t.IsValueType && !t.IsPrimitive && !t.IsEnum; 
+0

Tôi không hiểu lý do '! T.IsPrimitive'. 'Boolean',' Byte', 'Char',' Double' (vv ...) không phải là cấu trúc? –

+2

Đôi khi trong C# chúng ta đếm chúng như vậy, vì chúng là kiểu giá trị, nhưng 'struct' xuất phát từ" có cấu trúc ", đề cập đến bản chất tổng hợp của cấu trúc (thường có nhiều trường, mặc dù 0 hoặc 1 được phép) và xuất xứ của từ khóa trở lại trong C, mặc dù cấu trúc C# và C khác nhau theo nhiều cách. Rõ ràng từ câu hỏi mà OP đã suy nghĩ theo cách thứ hai hơn là trước đây. Quan điểm này không có góc nhìn "rùa xuống dốc", nhưng lấy các đơn vị không thể bị phá vỡ thêm nữa, không phải là cấu trúc. –

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