2014-08-30 13 views
25

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?

Trả lời

38

Biểu thức của biểu mẫu obj.GetType().IsInterface có bao giờ đúng trong một codebase bao gồm mã C# không?

Có - nhưng có lẽ không phải là cách bạn đang nghĩ đến việc:

using System; 

public class EvilClass 
{ 
    public new Type GetType() 
    { 
     return typeof(IDisposable); 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     EvilClass obj = new EvilClass(); 
     Console.WriteLine(obj.GetType().IsInterface); // True 
    } 
} 

Hơi tương tự, tôi tin rằng bạn có thể tạo một lớp con của RealProxy đó sẽ chặn cuộc gọi và trả về một kiểu giao diện.

Nếu bạn có nghĩa là "giá trị trả về của phương pháp GetType() được khai báo trong object từng là loại giao diện" - trong trường hợp đó tôi nghi ngờ câu trả lời là không.

+5

Devious. Tôi đoán đó là giá trị hai hoặc ba huy hiệu. :) – Jon

+7

+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

+0

Đố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

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