2011-09-18 64 views
5

我用「被」運營商,查找某一類:「是」 - 運營商類型

for(int i=0; i<screens.Count; i++){ 
    if(screen is ScreenBase){ 
    //do something... 
    } 
} 

能正常工作特別是因爲它認爲,從基篩繼承任何類,但是從沒有基類基篩。

我願做同樣的,當我知道只有類型,不希望將類實例:

Type screenType = GetType(line); 
if (screenType is ScreenBase) 

但這comparsion產生的,因爲它會比較「類型」級警告。

我知道的唯一選擇是與== typeof比較,但這隻會測試確切的類型而不是繼承的類型。 有沒有辦法得到類似「is」運算符的類似行爲,但對於Type-class描述的類型?

回答

5

如果你想具體知道它是否源自該類型,請使用Type.IsSubclassOf()。這不會工作的接口。

Type screenType = GetType(line); 
if (screenType.IsSubclassOf(typeof(ScreenBase))) 
{ 
    // do stuff... 
} 

否則,如果你想知道的類型可以被分配到某一類型的變量,使用Type.IsAssignableFrom()。這工作的接口。

Type screenType = GetType(line); 
if (typeof(ScreenBase).IsAssignableFrom(screenType)) // note the usage is reversed 
{ 
    // do stuff... 
} 

請注意,你不一定需要一個類型的對象,以確定這一點,你可以使用Type.IsInstanceOfType()對象的實例做到這一點。它的行爲或多或少像IsAssignableFrom()

if (typeof(ScreenBase).IsInstanceOfType(line)) // note the usage is reversed 
{ 
    // do stuff... 
} 
11

我知道的唯一選擇是與== typeof比較,但這隻會測試確切的類型而不是繼承的類型。有沒有辦法獲得類似「is」操作符的類似行爲,但對於Type類描述的類型?

如果GetType(line)返回類型(我推薦一個更好的名字爲,順便說一句),你可以使用Type.IsAssignableFrom

if (typeof(ScreenBase).IsAssignableFrom(GetType(line))) 
{ 
}