2012-05-02 27 views

Trả lời

153

Các câu trả lời khác đều chứa thiếu sót đáng kể.

Nhà điều hành is không không kiểm tra nếu kiểu thời gian chạy của các toán hạng là chính xác loại nhất định; đúng hơn, nó sẽ kiểm tra xem loại runtime tương thích với các loại nhất định:

class Animal {} 
class Tiger : Animal {} 
... 
object x = new Tiger(); 
bool b1 = x is Tiger; // true 
bool b2 = x is Animal; // true also! Every tiger is an animal. 

Nhưng kiểm tra cho loại sắc với kiểm tra phản ánh cho sắc, không phải cho tương thích

bool b3 = x.GetType() == typeof(Tiger); // true 
bool b4 = x.GetType() == typeof(Animal); // false! even though x is an animal 

Nếu đó không phải là những gì bạn muốn, thì có thể bạn muốn IsAssignableTừ:

bool b5 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true 
bool b6 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger. 
+1

Trong khi cách tiếp cận cuối cùng được hiển thị ở đây hoạt động, nó không cần thiết tiết lộ chi tiết. 'typeof (Animal) .IsInstanceOfType (x)' là ngắn hơn và đơn giản hơn 'typeof (Animal) .IsAssignableFrom (x.GetType());' (và Resharper sẽ gợi ý sử dụng cái cũ nếu bạn sử dụng cái sau). –

11

GetType() tồn tại trên mọi loại khung duy nhất, bởi vì nó được xác định trên loại cơ sở object. Vì vậy, bất kể loại bản thân, bạn có thể sử dụng nó để trả lại tiềm ẩn Type

Vì vậy, tất cả các bạn cần làm là:

u.GetType() == t 
+9

Eric trả lời dưới đây là tốt hơn - vui lòng đọc. –

+1

Thực ra câu trả lời của Eric là hữu ích và tất cả, nhưng không trả lời câu hỏi thực tế về cách kiểm tra với một loại không xác định theo cách "u là t" được mô tả trong câu hỏi gốc và của bạn. – Daniel

7

Bạn cần phải xem nếu Type sơ thẩm của bạn bằng Loại của lớp học. Để có được loại trường hợp bạn sử dụng phương pháp GetType():

u.GetType().Equals(t); 

hoặc

u.GetType.Equals(typeof(User)); 

nên làm điều đó. Rõ ràng bạn có thể sử dụng '==' để so sánh nếu bạn thích.

+0

+1 Nhưng thích chọn thứ hai. 'u.GetType.Equals (typeof (User));' –

+0

Một lý do nào đó kém an toàn hơn khi sử dụng == - là nếu GetType() bằng cách nào đó trả về null - nó sẽ ném. –

+1

@Fuex, vâng tôi, tôi nghĩ rằng nó làm cho mã dễ đọc hơn nếu typeof là nội tuyến, đó là lý do tại sao tôi đăng nó như thế, mặc dù trong ví dụ OPs, anh ta đã có biến 't' chứa loại . –

4

Để kiểm tra xem một đối tượng là tương thích với một loại biến nhất định, thay vì viết

u is t 

bạn nên viết

typeof(t).IsInstanceOfType(u) 
+1

Lợi ích của cú pháp chi tiết hơn so với cú pháp 'u là t' là gì? –

+0

@KyleHumfeld Nếu bạn có Loại foo; Đối tượng A; bạn không thể viết "A is foo", nhưng bạn có thể viết foo.isInstanceOfType (A) –

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