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

Casting generic function type arguments in c#

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

类: Base, Normal, Special

SpecialNormal都继承自basespecial是最后一个class但是normal有很多child classes

我的功能如下

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
}
   

GetObjectsSelectedFromSpecialreturns一个Special的列表,很好

GetObjectsSelectedFromNormal<T> 看起来像这样,可以传递 Normal

的任何 child
public List<T> GetObjectsSelectedFromNormal<T>() where T : Normal
{
    ...
    ExternalFunction<T>(); // this needs T to be of type `Normal`
    ...
}

但在行

... : (List<T>)GetObjectsSelectedFromNormal<T>();

我收到错误

The type 'T' cannot be used as type parameter 'T' in the generic type or method 'myProject.GetObjectsSelectedFromNormal()'. There is no implicit reference conversion from 'T' to 'Normal'.

有没有办法转换泛型类型参数?不是 T 类型的 object 而是 cast/convert/enforce-the-type-of T 本身?我看过的所有地方都只是在谈论将变量转换为 T

编辑: BaseNormalSpecial 是框架的内部 classes 我无权直接更改,因此涉及更改 classes 的解决方案不是可能

检查特定 类型的通用函数并不是真正的通用,是吗?因此,与其使用一个方法只根据实际类型将调用委托给另一个方法,不如首先为不同的类型使用不同的方法:

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