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

Ric*_*rdo 0 .net c# generics

我有以下通用方法:

protected IEnumerable<T> GetAnimals<T>() where T : Animal
{
  // code
}
Run Code Online (Sandbox Code Playgroud)

我可以使用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;
}
Run Code Online (Sandbox Code Playgroud)

typeof将返回Animal,而不是CatDog,所以这是我的问题.

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

有什么建议?

Pat*_*man 5

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

问题的实际解决方案:

bool isDog = typeof(T) == typeof(Dog);
Run Code Online (Sandbox Code Playgroud)

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

更好的方法可能是:

bool isDog = typeof(Dog).IsAssignableFrom(typeof(T));
Run Code Online (Sandbox Code Playgroud)

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