我如何跳过一般参数?

时间:2018-02-28 14:32:26

标签: c# generics reflection

有人可以帮我解决这个问题吗?

我有一些课,我无法改变。 像这样:

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方法并在方法体中使用反射来实例化具体类。如果第二个选项是真的,在这种情况下,有人可以帮我正确使用反射吗?

1 个答案:

答案 0 :(得分:0)

  

我只需要使用T1泛型参数在where构造中使用它,但它不能在工厂方法体中使用

可能没有,但T1SomeBaseClass<T1, T2>上必需的类型参数。除非你告诉它,否则编译器不可能推断出T1应该在什么类型。 <{1}}是不允许的。

如果您在设计时碰巧知道SomeBaseClass<_unknown_, T2>的类型是什么,是的,您可以硬编码,如下所示,否则,T1无法重构。

T1