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