使用typeof时,请考虑所有继承的类

时间:2014-01-08 21:40:27

标签: c# inheritance

我有几个类(其中一个名为Pet),它们扩展了类Animal。如果我有一个泛型方法,我可以使用typeof与基类进行比较吗?

if (typeof(T) == typeof(Animal))
{
    return ((Animal)pet).Color;
}

我的代码目前发生的事情是该子句完全被跳过。在此特定示例中不需要这样做,因为Pet继承自Animal

2 个答案:

答案 0 :(得分:2)

不要使用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关键字。这将强制编译时T的类型为Animal。这样......你甚至都不需要验证!

这意味着您的功能可能如下所示:

public void Foo<T>(T pet)
  where T : Animal
{
  return pet.Color;
}

更清洁,更快!

答案 1 :(得分:2)

虽然我会亲自走C#as运营商的路线来解决大部分情况(请参阅Andrew的回答),但您也可以根据需要使用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;
}