如何在泛型方法中获取T的类型?

时间:2014-11-28 11:04:33

标签: c# .net generics

我有以下通用方法:

protected IEnumerable<T> GetAnimals<T>() where T : Animal
{
  // code
}

我可以使用GetAnimals<Dog>()GetAnimals<Cat>()来调用此方法,其中Dog和Cat类继承自Animal

我需要的是让typeof(T)找到当前方法正在使用DogCat执行。到目前为止我已经尝试过了:

protected IEnumerable<T> GetAnimals<T>() where T : Animal
{
  bool isDog = typeof(T) is Dog ? true : false;
}

typeof会返回Animal而非CatDog,所以这是我的问题。

一种解决方案是在Animal中创建一个类似WhatIAm()的方法,并在Dog中return typeof(Dog)实现它,但我相信这是一个糟糕的解决方案。

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

首先,如果您需要在通用方法中进行类型检查,那么您可能采用了错误的方法/设计。通常这被认为是糟糕的设计。

问题的实际解决方案:

bool isDog = typeof(T) == typeof(Dog);

请注意,T必须与Dog完全匹配。从Dog派生的类被排除在外。

更好的方法可能是:

bool isDog = typeof(Dog).IsAssignableFrom(typeof(T));

此外,您不需要三元运算符。

答案 1 :(得分:2)

您可以直接比较这些类型

bool isDog = typeof(T) == typeof(Dog) ? true : false;

typeof(T)不返回Animal,它返回一个类型实例。 is运算符会比较Type是否与Dog兼容,这不是因为Dog和type之间没有关系。