Có rất nhiều câu hỏi về chủ đề này, nhưng tôi có một phiên bản thay đổi nhỏ của nó.Xác định xem một lớp có thực hiện một giao diện rất cụ thể hay không
Chúng tôi có đoạn mã sau:
interface IFoo { }
interface IBar : IFoo { }
class Foo : IFoo { }
class Bar : IBar { }
bool Implements_IFoo(Type type) { /* ??? */ }
Bây giờ, xoắn của câu chuyện: phương pháp Implements_IFoo
chỉ nên trở thành sự thật khi Type chỉ và không thực hiện bất kỳ IFoo các giao diện có nguồn gốc từ IFoo. Để minh họa ở đây là một số ví dụ về phương pháp này:
Implements_IFoo(typeof(Foo)); // Should return true
Implements_IFoo(typeof(Bar)); // Should return false as Bar type
// implements an interface derived from IFoo
Lưu ý rằng có thể có nhiều giao diện bắt nguồn từ IFoo và bạn không nhất thiết phải biết về sự tồn tại của chúng.
Phương pháp hiển nhiên là tìm tất cả các giao diện bắt nguồn từ IFoo thông qua sự phản ánh và sau đó chỉ cần kiểm tra typeof (Bar) .GetInterfaces() là bất kỳ thứ gì có trong đó. Nhưng tôi đã tự hỏi nếu ai đó có thể đưa ra một giải pháp thanh lịch hơn.
PS Câu hỏi bắt nguồn từ một số mã tôi thấy sử dụng kiểm tra này trên các lớp học (if(obj.GetType() == typeof(BaseClass)) { ... }
). Chúng tôi đang thay thế các lớp học bằng các giao diện ngay bây giờ với mã cụ thể đó. Ngoài ra, chỉ trong trường hợp - Tôi đang thực hiện kiểm tra này như là một lá cờ boolean, vì vậy câu hỏi này hoàn toàn là giả thuyết.
Tôi thực sự tò mò tại sao bạn cần loại nội tâm này ngay từ đầu. Rất có thể thiết kế của bạn là sai. – tdammers
Vui lòng đọc câu hỏi 'cho đến khi kết thúc trước khi nhận xét lần sau - Tôi đã giải thích rằng đây là một câu hỏi giả định;) – Jefim