Có một chút vấn đề với ý tưởng này, tuy nhiên, vì mọi đối tượng (và, thực sự, mọi loại) đều có một lớp cơ sở chung là Object. Những gì bạn cần xác định là cách xa chuỗi chuỗi thừa kế bạn muốn đi (cho dù đó là chúng giống nhau hoặc chúng có cùng cha mẹ trực tiếp hoặc một là cha mẹ trực tiếp của người khác, v.v.) và thực hiện kiểm tra theo cách đó. IsAssignableFrom
rất hữu ích để xác định xem các loại có tương thích với nhau hay không, nhưng sẽ không hoàn toàn thiết lập nếu chúng có cùng cha/mẹ (nếu đó là những gì bạn đang theo dõi).
Nếu tiêu chuẩn khắt khe của bạn là chức năng nên trở về đúng nếu ...
- Các loại giống hệt nhau
- Một loại là phụ huynh (ngay lập tức hay cách khác) của người kia
- Hai loại có cùng cha mẹ ngay lập tức
Bạn có thể sử dụng
private bool AreSame(Type a, Type b)
{
if(a == b) return true; // Either both are null or they are the same type
if(a == null || b == null) return false;
if(a.IsSubclassOf(b) || b.IsSubclassOf(a)) return true; // One inherits from the other
return a.BaseType == b.BaseType; // They have the same immediate parent
}
Nguồn
2009-04-02 04:28:28
+1 Tôi đã không nhận thức được rằng chức năng tiện dụng IsAssignableFrom, tôi sẽ phải ghi nhớ điều đó. – James
Có khá nhiều công cụ hữu ích trong hệ thống phân cấp Phản ánh! Thật thú vị khi duyệt qua danh sách thành viên - rất có thể bạn sẽ tìm thấy những gì mình cần. Do đọc tài liệu, mặc dù. Ví dụ, IsAssignableFrom sẽ trả về true nếu t là một tham số kiểu generic và u là một ràng buộc. –
Chỉ cần FYI, tuy nhiên, điều này sẽ không trở lại đúng nếu hai lớp có cùng một lớp cơ sở. –