【问题标题】:Casting generic function type arguments in c#在 C# 中转换泛型函数类型参数
【发布时间】:2020-08-26 09:57:21
【问题描述】:

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

类: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&lt;T&gt; 看起来像这样,并且可以传递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 类型的对象,而是T 本身的强制转换/强制类型?我看过的所有地方都只是在谈论将变量转换为T

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

【问题讨论】:

  • GetObjectsSelectedFromNormal T 对需要特定对象类型的方法的有效论证。在这种情况下,T 只是“Base”而不是“Normal”。这可能就是原因。
  • @MortenBork 好的,但我可以保证 T 在运行时将是 Normal 类型...有没有办法告诉 c# 这段代码没问题?甚至一些hacky? (我来自 c++,不习惯不信任我的语言)
  • 为什么不在Special 中覆盖DoWork
  • 嗯,像typeof(T) == typeof(Special) 这样带有一些类型检查的泛型函数与泛型的目的相矛盾,即“这个函数以相同的方式处理所有类型,而不管实际的T”。
  • 这对我来说真的很奇怪。您的 doWork 方法采用任何类型的 Base 类型,但在其中,有一个使用 Normal 的专用调用?

标签: c# generics casting typecasting-operator


【解决方案1】:

检查特定类型的通用函数并不是真正的通用,是吗?因此,与其拥有一个仅根据实际类型将调用委托给另一个方法的方法,不如一开始就为不同的类型设置不同的方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多