我有两个可以接受泛型类型参数的泛型函数,并且我有三个主要类和很多子类
类:Base
,Normal
,Special
Special
和Normal
都从base
继承而来,special
是最终类,但是normal
有很多子类
我的功能如下
public void doWork<T>() where T:Base
{
list<T> =
typeof(T) == typeof(Special) ?
(List<T>)Convert.ChangeType(GetObjectsSelectedFromSpecial(),typeof(List<T>)) : // this is very ugly
(List<T>)GetObjectsSelectedFromNormal<T>(); // this will not compile
}
GetObjectsSelectedFromSpecial
返回Special
的列表,很好
GetObjectsSelectedFromNormal<T>
如下所示,并且可以传递Normal
public List<T> GetObjectsSelectedFromNormal<T>() where T : Normal
{
...
ExternalFunction<T>(); // this needs T to be of type `Normal`
...
}
但在行
... : (List<T>)GetObjectsSelectedFromNormal<T>();
我得到了错误
类型'T'不能在通用类型或方法'myProject.GetObjectsSelectedFromNormal()'中用作类型参数'T'。没有从“ T”到“ Normal”的隐式引用转换。
有没有一种方法可以转换泛型类型参数?不是T
类型的对象,而是本身{cast / convert / enforce-the-type-of T
的对象?我到过的所有地方都只是在谈论在T
编辑:
Base
,Normal
和Special
是我无法直接更改的框架的内部类,因此无法进行涉及更改类的解决方案
答案 0 :(得分:3)
检查特定类型的通用函数不是真正的通用,是吗?因此,除了拥有一个仅根据实际类型将调用委派给另一个方法的方法之外,首先要针对不同类型使用不同的方法:
public void DoWorkBase() { ... }
public void DoWorkNormal()
{
var list = GetObjectsSelectedFromNormal();
}
public void DoWorkSpecial()
{
var list = GetObjectsSelectedFromSpecial();
}