[英]Consider all inherited classes when using typeof
我有幾個類(其中一個叫做Pet
)擴展了Animal
類。 如果我有通用方法,可以使用typeof
與基類進行比較嗎?
if (typeof(T) == typeof(Animal))
{
return ((Animal)pet).Color;
}
我的代碼中當前正在發生的事情是該子句被完全跳過。 在此特定示例中,這是不希望的,因為Pet
繼承自Animal
。
代替使用typeof(T) == typeof(Animal)
,請執行以下操作:
var animal = pet as Animal;
if(animal != null)
return animal.Color;
這樣可以節省額外的類型檢查。
請注意as
和is
as
僅可用於參考的類型。 如果您嘗試使用as
,但失敗...它將返回null
。 如果只想檢查某個值是否為某種類型,請使用is
。 它返回一個boolean
。
關鍵字Where
但是,讓我們也看看使用泛型可以做什么!
public void Foo<T>(T pet)
where T : Animal
{
}
注意where
關鍵字。 這將在編譯時強制T
為Animal
類型。 這樣,您甚至不必驗證!
這意味着您的函數可能如下所示:
public void Foo<T>(T pet)
where T : Animal
{
return pet.Color;
}
更干凈,更快!
盡管在大多數情況下,我本人都將C# as
運算符(請參閱安德魯的答案),但您也可以根據需要使用Type.IsAssignableFrom
:
if (typeof(Animal).IsAssignableFrom(typeof(T)))
{
return ((Animal)pet).Color;
}
附帶一提,我通常更喜歡Type.IsAssignableFrom
不是Type.IsSubclassOf
因為IsAssignableFrom
也可以與接口一起使用。
哦,您還可以使用的is
:
if (pet is Animal)
{
return ((Animal)pet).Color;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.