Trong khi làm một cái gì đó gần như hoàn toàn không thích hợp, một câu hỏi nảy ra trong đầu tôi:Có thể obj.GetType(). IsInterface có đúng không?
thể một biểu thức có dạng obj.GetType().IsInterface
bao giờ là sự thật trong một codebase gồm độc quyền của mã C#?
tôi nghi ngờ câu trả lời là không, bởi vì:
GetType()
sẽ luôn luôn trả về kiểu chạy.- Loại thời gian chạy cho các loại bê tông khớp với hàm tạo được gọi. Do đó, nó không bao giờ là một giao diện, bởi vì các giao diện không có các hàm tạo.
- Các loại ẩn danh không thể triển khai giao diện (và nếu có, chúng vẫn có loại lớp ẩn danh).
- Trường hợp của các lớp bên trong của các hội đồng khác thực hiện giao diện công cộng sẽ vẫn có lớp là loại thời gian chạy.
- Using
[ComImport, CoClass(typeof(MyClass))]
on an interface làm cho nó trông giống như bạn có thể khởi tạo nó, nhưng lời gọi hàm tạo thực sự khởi tạo lớp được tham chiếu.
Tôi không thể nghĩ ra bất kỳ trường hợp nào khác. Tôi có thiếu một cái gì đó, hoặc là đoán của tôi đúng?
Devious. Tôi đoán đó là giá trị hai hoặc ba huy hiệu. :) – Jon
+1 để chứng minh nó có thể được thực hiện, nhưng có một số điều tốt nhất không được dạy. Nếu tôi * bao giờ * phải sửa mã đã thực hiện điều này. Tôi sẽ đến tìm bạn @Jon. Chỉ đùa thôi. :) – cgTag
Đối với các lớp COM, 'mới ISomeComInterface() 'chỉ đơn thuần là một thủ thuật biên dịch: nó dịch nó thành một cái gì đó khác, hoặc là' SomeComClass() 'hoặc' Activator.CreateInstance (Type.GetTypeFromCLSID (SomeComGuid)) '. Dù bằng cách nào, thời gian chạy sẽ không bao giờ thấy một giao diện được tạo ra, vì vậy tôi không nghĩ rằng có thể được sử dụng để có được 'GetType()' để trả về một giao diện. – hvd