有人可以帮我解决这个问题吗?
我有一些课,我无法改变。 像这样:
public class SomeBaseClass<T1, T2>
where T2 : SomeBaseClass<T1, T2>
{ }
我做了一个儿童班:
public class SomeConcretClass : SomeBaseClass<int, SomeConcretClass>
{ }
现在,我想创建一个工厂来实例化这个类。 像这样:
public class SomeFactory
{
public T2 CreateSome<T1, T2>()
where T2 : SomeBaseClass<T1, T2>, new()
{
return new T2();
}
}
正如您所看到的,我只需要在 where 构造中使用T1 generic参数,但它不会在工厂方法体中使用。 我想实现Create方法,如下所示:
public T2 CreateSome<T2>()
where T2 : SomeBaseClass<, T2>, new()
{
return new T2();
}
但由于C#限制,我无法做到这一点。有没有办法实现方法,就像我之前描述的where构造和不使用泛型参数,或者只有一种方法 - 使用只有一个泛型参数的Create方法并在方法体中使用反射来实例化具体类。如果第二个选项是真的,在这种情况下,有人可以帮我正确使用反射吗?
答案 0 :(得分:0)
我只需要使用T1泛型参数在where构造中使用它,但它不能在工厂方法体中使用
可能没有,但T1
是SomeBaseClass<T1, T2>
上必需的类型参数。除非你告诉它,否则编译器不可能推断出T1
应该在什么类型。 <{1}}是不允许的。
如果您在设计时碰巧知道SomeBaseClass<_unknown_, T2>
的类型是什么,是的,您可以硬编码,如下所示,否则,T1
无法重构。
T1