2014-08-30 58 views
25

雖然幾乎完全不相干做的事情,一個問題突然出現在我的腦海:Can obj.GetType()。IsInterface是真的嗎?

能否形式obj.GetType().IsInterface的表達永遠是由專門的C#代碼代碼庫是真的嗎?

我懷疑答案是否定的,因爲:

  • GetType()總是返回運行時類型。
  • 具體類型的運行時類型與調用的構造函數匹配。因此,它從來不是一個接口,因爲接口沒有構造函數。
  • 匿名類型不能實現一個接口(如果他們做到了,他們還是不得不自己匿名類類型)。
  • 實現公共接口的其他程序集的內部類的實例仍將具有該類作爲運行時類型。
  • Using [ComImport, CoClass(typeof(MyClass))] on an interface使它看起來像您可以實例,但構造函數調用實際實例引用的類。

我想不出任何其他情況。我錯過了什麼,或者我的猜測是正確的?

回答

38

在僅由C#代碼組成的代碼庫中,表達式obj.GetType().IsInterface是否成立?

是 - 但可能不是這樣,你在想的:

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 
    } 
} 

稍微同樣,我相信你可以創建一個RealProxy子類,將攔截調用和返回的接口類型。

如果您的意思是「將object中聲明的GetType()方法的返回值永遠作爲接口類型」 - 在這種情況下,我懷疑答案是否定的。

+5

迂迴。我猜這值得兩三個徽章。 :) – Jon 2014-08-30 16:43:03

+7

+1證明它可以完成,但有一些事情最好不教。如果我*永遠*必須修復這樣做的代碼。我會去找你@Jon。只是在開玩笑。 :) – cgTag 2014-08-30 16:49:31

+0

對於COM類,'新ISomeComInterface()'只是一個編譯器的技巧:把它轉換成別的東西,要麼'新SomeComClass()'或'Activator.CreateInstance(Type.GetTypeFromCLSID(SomeComGuid))'。無論哪種方式,運行時永遠不會看到一個接口被創建,所以我不認爲可以用'GetType()'返回一個接口。 – hvd 2014-08-31 10:00:42