在C#中强制转换泛型函数类型参数

时间:2020-08-26 09:57:21

标签: c# generics casting typecasting-operator

我有两个可以接受泛型类型参数的泛型函数,并且我有三个主要类和很多子类

类:BaseNormalSpecial

SpecialNormal都从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

之间进行变量转换

编辑: BaseNormalSpecial是我无法直接更改的框架的内部类,因此无法进行涉及更改类的解决方案

1 个答案:

答案 0 :(得分:3)

检查特定类型的通用函数不是真正的通用,是吗?因此,除了拥有一个仅根据实际类型将调用委派给另一个方法的方法之外,首先要针对不同类型使用不同的方法:

public void DoWorkBase() { ... }
public void DoWorkNormal() 
{
    var list = GetObjectsSelectedFromNormal();
}
public void DoWorkSpecial() 
{ 
    var list = GetObjectsSelectedFromSpecial();
}