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

周杰伦

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

类:BaseNormalSpecial

无论SpecialNormal继承basespecial是一个final类,但是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>();

我得到错误

在通用类型或方法“ myProject.GetObjectsSelectedFromNormal()”中,类型“ T”不能用作类型参数“ T”。没有从“ T”到“ Normal”的隐式引用转换。

有没有一种方法可以转换泛型类型参数?不是类型的对象,T而是T自身的类型转换/转换/强制类型我看过的每个地方都只是在谈论向和从的转换变量T

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

HimBromBeere

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章