2012-01-02 21 views
95

Giả sử tôi có một lớp trông như thế này:Làm cách nào để kiểm tra xem một lớp có kế thừa lớp khác mà không khởi tạo lớp đó không?

class Derived : // some inheritance stuff here 
{ 
} 

Tôi muốn kiểm tra một cái gì đó như thế này trong mã của tôi:

Derived is SomeType; 

Nhưng trông giống như nhu is điều hành nguồn gốc được biến kiểu Dervied , không xuất phát từ chính nó. Tôi không muốn tạo đối tượng thuộc loại Có nguồn gốc.
Làm cách nào để đảm bảo Derived kế thừa SomeType mà không cần khởi tạo?

P.S. Nếu nó giúp, tôi muốn một cái gì đó giống như những gì where từ khóa không với generics.
CHỈNH SỬA:
Tương tự như this câu trả lời nhưng kiểm tra đối tượng. Tôi muốn kiểm tra bản thân lớp.

Trả lời

207

Để kiểm tra các assignability, bạn có thể sử dụng Type.IsAssignableFrom phương pháp:

typeof(SomeType).IsAssignableFrom(typeof(Derived)) 

này sẽ làm việc như bạn mong đợi sự bình đẳng kiểu, quan hệ thừa kế và triển khai giao diện nhưng không phải khi bạn đang tìm kiếm 'khả năng chuyển nhượng' trên các toán tử chuyển đổi rõ ràng/tiềm ẩn.

Để kiểm tra các thừa kế chặt chẽ, bạn có thể sử dụng Type.IsSubclassOf:

typeof(Derived).IsSubclassOf(typeof(SomeType)) 
+1

Cũng giống như một lưu ý cho bất cứ ai khác tự hỏi, điều này sẽ không trở thành sự thật khi kiểm tra đối với định nghĩa kiểu/giao diện chung chung, như xa như tôi có thể cho bạn biết cần phải tìm kiếm chuỗi thừa kế và tự kiểm tra các định nghĩa kiểu generic. –

+0

Alex, làm thế nào bạn sẽ đi về tìm kiếm chuỗi thừa kế của một loại chung chung để thực hiện điều này? Ghi chú của –

+0

@ AlexHopeO'Connor là quan trọng và tôi nghĩ giải pháp là có http://stackoverflow.com/questions/457676/check-if-a-class-is-derived-from-a-generic-class –

18

Hãy thử điều này

typeof(IFoo).IsAssignableFrom(typeof(BarClass)); 

Điều này sẽ cho bạn biết liệu BarClass(Derived) thực hiện IFoo(SomeType) hay không

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