我有以下通用方法:
protected IEnumerable<T> GetAnimals<T>() where T : Animal
{
// code
}
我可以使用GetAnimals<Dog>()
或GetAnimals<Cat>()
来调用此方法,其中Dog和Cat类继承自Animal
。
我需要的是让typeof(T)
找到当前方法正在使用Dog
或Cat
执行。到目前为止我已经尝试过了:
protected IEnumerable<T> GetAnimals<T>() where T : Animal
{
bool isDog = typeof(T) is Dog ? true : false;
}
此typeof
会返回Animal
而非Cat
或Dog
,所以这是我的问题。
一种解决方案是在Animal
中创建一个类似WhatIAm()
的方法,并在Dog中return typeof(Dog)
实现它,但我相信这是一个糟糕的解决方案。
有什么建议吗?
答案 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之间没有关系。