2010-05-24 37 views
6

我想將對象的類型與類型進行比較以查看它們是否相同。我沒有對象,只有對象的類型。「is」操作符如何在內部工作

我可以做type1 == type2並得到普遍平等

我可以有一個遞歸循環,我重複上述步驟,直到type1.BaseType的基本類型爲null。

我可以做type1.GetInterface(type2.FullName) != null檢查,如果2型是TYPE1

的接口如果我把它放在一起,我得到

if (type2.IsInterface) 
    return type1.GetInterface(type2.FullName) != null; 

while (type1 != null) { 
    if (type1 == type2) 
    return true; 

    type1 = type1.BaseType; 
} 
return false; 

是所有is關鍵字。我找不到插入反射器搜索來查找功能和谷歌搜索正確的關鍵字「是」是不是真的有幫助

+9

這取決於'is'這個詞的含義是 – 2010-05-24 15:34:52

+0

+1有趣。但是,我會假設「is」關鍵字是在運行時本地實現的,並且不使用反射。 – tster 2010-05-24 15:38:21

+3

我從來沒有想過我會看到有關比爾克林頓的報價。 – 2010-05-24 15:42:26

回答

6

is(的the standard§14.9.10)一般使用isinst,但它不如果編譯時類型需要通過某些轉換來兼容。

與Type對象的等價物(反向)是IsAssignableFrom。所有這些都是真實的:

"foo" is String; 
"foo" is object; 

typeof(String).IsAssignableFrom("foo".GetType()); 
typeof(object).IsAssignableFrom("foo".GetType()); 
+1

請注意,並不總是生成'isinst'指令。 C#編譯器可以告訴你什麼時候處於愚蠢狀態,並且會用null而不是'isinsts'生成比較結果。 – 2010-05-24 16:03:42