簡體   English   中英

使用typeof時請考慮所有繼承的類

[英]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;

這樣可以節省額外的類型檢查。

請注意asis

as僅可用於參考的類型。 如果您嘗試使用as ,但失敗...它將返回null 如果只想檢查某個值是否為某種類型,請使用is 它返回一個boolean

關鍵字Where

但是,讓我們也看看使用泛型可以做什么!

public void Foo<T>(T pet)
  where T : Animal
{
}

注意where關鍵字。 這將在編譯時強制TAnimal類型。 這樣,您甚至不必驗證!

這意味着您的函數可能如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM