2010-01-29 32 views
17

Tôi muốn kiểm tra loại đối tượng. Tôi chỉ muốn trả về true nếu kiểu đó giống hệt nhau. Các lớp thừa kế phải trả về false.C# kiểm tra chính xác loại

ví dụ:

class A {} 
class B : A {} 

B b = new B(); 

if(b is A) // this should return false 
+0

dụ của bạn và câu hỏi của bạn không làm cho ý thức với nhau. Bạn nói rằng bạn chỉ muốn trả về true nếu kiểu được kế thừa, nhưng sau đó cho thấy rằng một so sánh được kế thừa sẽ trả về false. –

+0

Tôi nghĩ rằng bạn có nghĩa là bạn chỉ muốn trả lại đúng khi đó là chính xác cùng loại (không được kế thừa). Nếu không, bình luận trong mã của bạn là sai. – rui

Trả lời

37
b.GetType() == typeof(A) 
+2

Trong ví dụ ban đầu, anh ta muốn: 'b.GetType() == typeof (A)' vì 'a' không được khai báo. –

+0

Đó là lý do tại sao tôi đăng câu trả lời của tôi, một câu trả lời sau này. –

+0

@jdk - Cảm ơn, đã sửa. – ChaosPandion

4

mẫu mã của bạn có vẻ là ngược lại với câu hỏi của bạn.

bool isExactTypeOrInherited = b is A; 
bool isExactType = b.GetType() == a.GetType(); 
+1

Bạn có nghĩa là typeof (a) trong dòng thứ hai, không phải là a.GetType(), có? –

+0

Tôi có nghĩa là A lớn trong dòng đầu tiên của khóa học: -> ... f1x0red – herzmeister

0

Vui lòng sử dụng chức năng Tìm kiếm trước khi đặt câu hỏi mới.

Câu hỏi này đã được trả lời đã:

Check if types are castable/subclasses

và làm ngược lại - trả về false nếu một loại là một lớp con.

EDIT: Một câu hỏi liên quan: Type Checking: typeof, GetType, or is?

+0

Nó không phải là cùng một câu hỏi. –

+0

Cũng giống như được hỏi theo cách ngược lại và rất đơn giản để nắm bắt ý tưởng. Nó giống như việc hỏi hai câu hỏi riêng biệt: cách kiểm tra sizeof (int) bằng 4 byte và cách kiểm tra sizeof (int) không bằng 4 byte. Một dự phòng sạch sẽ, phải không. Một lập trình viên có nghĩa vụ phải suy nghĩ và giải quyết một vấn đề cụ thể nhưng không phải là giải pháp sao chép giống như một con khỉ. – mloskot

+4

Quá nhiều hướng cho sở thích của tôi trên diễn đàn Hỏi & đáp. Theo tôi, một câu hỏi riêng và câu trả lời chính xác là tốt nhất ngay cả khi đó là một biến thể về một cái gì đó khác được trả lời. Nó giúp mọi người dễ dàng tìm thấy câu trả lời trên SO theo cách này. Chắc chắn, công việc của bạn không phải là một con khỉ nhưng SO chín muồi với chuối. –

8

sử dụng:

if (b.GetType() == typeof(A)) // this returns false 
+1

+1 cho tất cả các lý do được nêu trong goings-on trong chủ đề này! –

3
bool IsSameType(object o, Type t) { 
    return o.GetType() == t; 
} 

Sau đó, bạn có thể gọi phương thức như thế này:

IsSameType(b, typeof(A)); 
+1

Điều này không hoạt động. Nó là hoàn toàn hợp pháp - hiếm, nhưng hợp pháp - cho hai loại khác nhau để có cùng tên đầy đủ nhưng là các loại khác nhau. Tại sao không chỉ so sánh o.GetType() với t, thay vì đi qua các tên? (Nếu bạn đang ở trong tình trạng không may có hai loại có cùng tên đầy đủ và bạn cần sử dụng chúng trong cùng một cụm thì bạn có thể sử dụng một bí danh lắp ráp đã nhập để phân biệt chúng.) –

+1

Điểm tốt, cập nhật mã. – rui

10

(b is A) kiểm tra b cho loại tương thích với A có nghĩa là nó kiểm tra cả hệ thống phân cấp thừa kế của b và im các giao diện plemented cho Type A.

b.GetType() == typeof(A) mặt khác sẽ kiểm tra chính xác chính xác cùng loại. Nếu bạn không đủ điều kiện cho các Loại khác (tức là đang truyền) thì bạn đang kiểm tra loại khai báo của b.

Trong cả hai trường hợp (sử dụng một trong các phần trên), bạn sẽ nhận được true nếu b là chính xác loại A.

Hãy cẩn thận để biết lý do tại sao bạn muốn sử dụng các loại chính xác trong một tình huống khác hơn:

  • Ví dụ: để kiểm tra các loại chính xác đánh bại mục đích của tính đa hình OO mà bạn có thể không muốn làm cuối cùng.
  • Tuy nhiên, ví dụ: nếu bạn đang triển khai mẫu thiết kế phần mềm chuyên dụng như Vùng chứa điều khiển IoC, thì đôi khi bạn sẽ muốn làm việc với các loại chính xác.

Edit:

Trong ví dụ của bạn,

if(b is A) // this should return false 

lượt nó thành một loại kiểm tra tuyên bố chính xác sử dụng:

if (b.GetType() == typeof(A)) 
+1

+1 cho nhóm, :) –

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