我有几个类(其中一个名为Pet
),它们扩展了类Animal
。如果我有一个泛型方法,我可以使用typeof
与基类进行比较吗?
if (typeof(T) == typeof(Animal))
{
return ((Animal)pet).Color;
}
我的代码目前发生的事情是该子句完全被跳过。在此特定示例中不需要这样做,因为Pet
继承自Animal
。
答案 0 :(得分:2)
不要使用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;
}
更清洁,更快!
答案 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;
}