通用类型作为类型参数

时间:2014-02-04 10:35:16

标签: c# generics type-parameter

是否可以使用需要类型参数的泛型类型参数?

public abstract class ClassA<T>
{}
public class ClassB<T>:ClassA<T>
{}
...
public void MethodA<T>() where T:ClassA, new()
{
  T<string> x=new T<string>();
}
...
MethodA<ClassB>();

这会产生错误,因为ClassB在最后一行需要一个类型参数。

我是否可以使用一段缺少的语法来完成这项工作?

(旁注,这个问题在很大程度上是理论上的,因为如果没有上述内容我可以实现我想要的东西,但上述内容肯定会使用户端代码更清晰,尽管在MethodA中可能会更加混乱,因为反射几乎肯定会出现在在某些时候玩)

2 个答案:

答案 0 :(得分:0)

您必须向MethodA添加其他通用参数:

public void MethodA<T, K>() where T:ClassA<K>, new()
{
  T<K> x=new T<K>();
}

或为ClassA泛型参数指定预定义值:

public void MethodA<T>() where T:ClassA<string>, new()
{
  T<string> x=new T<string>();
}

您不能将ClassA指定为基类,因为实际上没有这样的comiled类。系统将为[每个]不同类型K编译几个不同的类。(实际上不是每个,但这是详细信息)。

由于ClassA只能与参数一起使用,如果您事先不知道它的类型,则必须在方法中添加另一个通用参数。

在某些情况下(从我看到的不是你的情况,但也许你又错过了一些东西),确实需要为所有泛型类都有一些基类。在这种情况下,您可以像这样创建它:

public class ClassABase
{ }

public abstract class ClassA<T> : CkassABase
{}

public void MethodA<T, K>() where T:ClassABase, new()
{
  T<string> x=new T<string>();
}

答案 1 :(得分:0)

帮助您集体讨论解决方案:

public class ClassA<T>
{}
public class ClassB<T>:ClassA<T>
{}
...
public void MethodA<T1, T2>() where T1 : ClassA<T2>, new()
{
  ClassA<T2> x=new ClassA<T2>();
}
...
public void MethodB<T1>() 
{
  ClassA<T1> x = new ClassA<T1>();
}

MethodA<ClassB>();

这取决于您的使用案例,这在您的问题中并不明显。