繁体   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