在 C# 中转换泛型函数类型参数
Casting generic function type arguments in c#
我有两个可以接受泛型类型参数的泛型函数,我有三个主要 classes 和很多子 classes
类: Base
, Normal
, Special
Special
和Normal
都继承自base
,special
是最后一个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
}
GetObjectsSelectedFromSpecial
returns一个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
编辑:
Base
、Normal
和 Special
是框架的内部 classes 我无权直接更改,因此涉及更改 classes 的解决方案不是可能
检查特定 类型的通用函数并不是真正的通用,是吗?因此,与其使用一个方法只根据实际类型将调用委托给另一个方法,不如首先为不同的类型使用不同的方法:
public void DoWorkBase() { ... }
public void DoWorkNormal()
{
var list = GetObjectsSelectedFromNormal();
}
public void DoWorkSpecial()
{
var list = GetObjectsSelectedFromSpecial();
}
我有两个可以接受泛型类型参数的泛型函数,我有三个主要 classes 和很多子 classes
类: Base
, Normal
, Special
Special
和Normal
都继承自base
,special
是最后一个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
}
GetObjectsSelectedFromSpecial
returns一个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>();
我收到错误
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
编辑:
Base
、Normal
和 Special
是框架的内部 classes 我无权直接更改,因此涉及更改 classes 的解决方案不是可能
检查特定 类型的通用函数并不是真正的通用,是吗?因此,与其使用一个方法只根据实际类型将调用委托给另一个方法,不如首先为不同的类型使用不同的方法:
public void DoWorkBase() { ... }
public void DoWorkNormal()
{
var list = GetObjectsSelectedFromNormal();
}
public void DoWorkSpecial()
{
var list = GetObjectsSelectedFromSpecial();
}