C# 泛型类型作为类型参数

C# 泛型类型作为类型参数,c#,generics,type-parameter,C#,Generics,Type Parameter,是否可能有需要类型参数的泛型类型参数 i、 e 公共抽象类ClassA {} B类:A类 {} ... public void MethodA(),其中T:ClassA,new() { T x=新的T(); } ... 方法a(); 这会产生错误,因为ClassB在最后一行需要一个类型参数 我是否可以使用缺少的语法来实现这一点 (旁注,这个问题在很大程度上是理论性的,因为我可能不需要上面的内容就可以实现我想要的,但是上面的内容肯定会让用户端代码更清晰,尽管MethodA内部可能更混乱,因为反射

是否可能有需要类型参数的泛型类型参数

i、 e

公共抽象类ClassA
{}
B类:A类
{}
...
public void MethodA(),其中T:ClassA,new()
{
T x=新的T();
}
...
方法a();
这会产生错误,因为ClassB在最后一行需要一个类型参数

我是否可以使用缺少的语法来实现这一点


(旁注,这个问题在很大程度上是理论性的,因为我可能不需要上面的内容就可以实现我想要的,但是上面的内容肯定会让用户端代码更清晰,尽管MethodA内部可能更混乱,因为反射几乎肯定会在某个时候出现)

您必须在
方法A
中添加额外的通用参数:

public void MethodA<T, K>() where T:ClassA<K>, new()
{
  T<K> x=new T<K>();
}
public void MethodA(),其中T:ClassA,new()
{
T x=新的T();
}
或指定ClassA泛型参数的预定义值:

public void MethodA<T>() where T:ClassA<string>, new()
{
  T<string> x=new T<string>();
}
public void MethodA(),其中T:ClassA,new()
{
T x=新的T();
}
您不能将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>();
}
公共类数据库
{ }
公共抽象类ClassA:CkassABase
{}
public void MethodA(),其中T:ClassABase,new()
{
T x=新的T();
}

要帮助您集思广益地找到解决方案,请执行以下操作:

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>();
公共类ClassA
{}
B类:A类
{}
...
public void MethodA(),其中T1:ClassA,new()
{
ClassA x=新的ClassA();
}
...
公共无效方法b()
{
ClassA x=新的ClassA();
}
方法a();

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

您有一些代码不起作用,但您没有描述您试图解决的更大问题,这使得您很难找到好的解决方案。例如,您可能希望声明一个非泛型的
ClassA
作为
ClassA
的基本类型。。。或者你可能不知道。我明白你的想法,是的,我原来的帖子中有一个问题,我会根据你的改变更正我的答案。现在它应该如您所期望的那样工作。不幸的是,这不太有效,因为我希望在您的示例中K的值在内部由MethodA决定。我基本上可以忽略K并指定我需要的任何内容,但这将回到您强调的原始问题,即使用未使用的类型参数如果您有这么多特定的需求,为什么不将它们放在原始问题中?我们看不到你的问题,那我们怎么帮你呢?无论如何,我的上一个代码示例应该允许您“在方法中定义K”。很抱歉,我想我已经说过了。我还没有尝试过您的示例,但是我怀疑t可能会导致编译错误,因为t不是泛型的
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>();