2009-09-16 52 views

Trả lời

21

Type.IsSubclassOf() Xác định xem lớp được thể hiện bằng Loại hiện tại có xuất phát từ lớp được thể hiện bằng Loại được chỉ định hay không.

+1

Hmm ... Điều đó cũng hoạt động tốt. Bây giờ tôi tò mò sự khác biệt giữa Type.IsAssgnableFrom và Type.IsSubclassOf là gì? – sh0gged

+1

type1.IsAssignableFrom (type2) sẽ hoạt động nếu type1 là một giao diện –

+0

Bây giờ tôi đoán Type.IsSubclassOf() giống như những gì tôi đang tìm kiếm. :) Cảm ơn bạn. – sh0gged

14

Có thể bạn đang tìm kiếm Type.IsAssignableFrom.

+0

Yeap, phù hợp với tôi. Cảm ơn! – sh0gged

+0

Điều này rất hữu ích, nhưng nó sẽ trả về 'true' nếu cả hai loại đều giống nhau. Có một số khác biệt giữa khả năng tương thích gán và thừa kế. Tôi cũng thấy khó đọc hơn 'IsSubClassOf'. – Sam

0

Tôi nghĩ rằng bạn đang tìm kiếm này Type.IsSubclassOf()

Edit:

Tôi không biết yêu cầu của bạn nhưng có thể thats cách tốt nhất:

bool isDescendant = cValue is C; 
+1

Tôi nghĩ trong trường hợp System.Type không hoạt động. – sh0gged

5

Tôi nhận ra điều này không trả lời trực tiếp câu hỏi của bạn, nhưng bạn có thể xem xét sử dụng câu hỏi này thay vì phương pháp trong ví dụ của mình:

public static bool IsDescendantOf<T>(this object o) 
{ 
    if(o == null) throw new ArgumentNullException(); 
    return typeof(T).IsSubclassOf(o.GetType()); 
} 

Vì vậy, bạn có thể sử dụng nó như thế này:

C c = new C(); 
c.IsDescendantOf<A>(); 

Ngoài ra, để trả lời câu hỏi của bạn về sự khác biệt giữa Type.IsSubclassOf và Type.IsAssignableFrom - IsAssignableFrom là yếu theo nghĩa là nếu bạn có hai đối tượng a và b sao cho điều này hợp lệ:

a = b; 

Sau đó typeof(A).IsAssignableFrom(b.GetType()) là đúng - vì vậy có thể là phân lớp của b hoặc loại giao diện.

Ngược lại, a.GetType().IsSubclassOf(typeof(B)) sẽ chỉ trả về true nếu là một phân lớp của b. Với tên của phương thức mở rộng của bạn, tôi muốn nói bạn nên sử dụng IsSubclassOf thay vì IsAssignable;

+0

Điểm tốt. Cảm ơn. – sh0gged

+0

Đoạn cuối cùng của bạn có đúng không? Tôi nghĩ 'a.GetType(). IsAssignableFrom (typeof (b))' sẽ là true nếu 'a = b;' hợp lệ. – Sam

+0

@Sam - Có bạn nói đúng, cảm ơn. – Lee

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