是否可以使用/提取泛型使用的类型来定义第二个泛型类型?

时间:2016-11-28 06:56:52

标签: c# generics types

我知道标题可能有点不清楚,所以我会解释我想要做的事情。

  

请注意,这更多是出于教育原因围绕语言的功能。换句话说,如果这是可能的,那么应该这就是了解它的方法。

考虑以下通用类:

public class Foo<TId>
{
    TId Id { get; set; }
}

现在考虑基于上述的具体子类。这是使用'int'和'string'的两个例子......

public class IntFoo : Foo<int>
{
}

public class StrFoo : Foo<string>
{
}

最后是一个将Foo作为类型参数的泛型,并继承自从Foo获取其类型参数的Laa。

public class BaseClass<TFoo, TFooId> : Laa<TFooId>
{
}

public class Laa<TFooId>
{
}

以下是基于int和string的方法,但是除了IntFoo和StrFoo之外,我还要明确定义int和foo ......

public class IntFinal : BaseClass<IntFoo, int>
{
    char somePropSpecificToIntFinal{ get; set; }
}

public class StrFinal : BaseClass<StrFoo, string>
{
    char somePropSpecificToStrFinal{ get; set; }
}
  

请注意,这些'final'类是具有自己属性的具体类型,不能简化为采用类型的泛型(即使用具有单一类型T的泛型,然后将另一个通用子类化为Foo和T作为其论据。

我想知道是否有一种方法可以推断出这种类型,所以可以像这样编写......

public class IntFinal : BaseClass<IntFoo>
{
}

public class StrFinal : BaseClass<StrFoo>
{
}

...并且从Foo上指定的泛型中隐含了Laa的类型。这是我想要的伪代码示例。

public class BaseClass<TFoo> : Laa<TFoo.IdType>
{
}

那么在C#中可能吗?

注意,如果这不能用类完成,可以用接口完成吗?

考虑一下......

interface IFoo
{
    Type FoosType { get; }
}

public class Foo<TId> : Foo
{
    TId Id { get; set; }

    Type FoosType { get{ return TId } }
}

然后这样做......

public class BaseClass<TFoo> : Laa<TFoo.FoosType>
where TFoo : Foo
{
}

(注意:FoosType在技术上必须是静态的,你不能再使用静态继承,这是伪代码。)

如果你将TFoo约束为IFoo,你可以在定义Laa时使用'FoosType'作为类型说明符吗?

2 个答案:

答案 0 :(得分:0)

您无法根据C#规范执行此操作。类型推断目前仅适用于方法,并不适用于类型(类似于您的类)

违反所需结果的第二条规则是,您无法指定一个泛型类型参数并推断另一个,为方法提供全部或全部大小写。

C#规范:

  

1.6.3输入参数

     

使用泛型类时,必须为每个类型参数提供类型参数

答案 1 :(得分:-1)

您的问题不是非常具体,并且不清楚实际的约束和要求是什么。那说......

类型推断仅针对泛型方法而非泛型类型进行。所以从字面上看你的问题,答案是否定的,没有办法推断出类型。

可能对你有用的是在类定义中使用Foo<TId>而不是IntFoo

class BaseClass<TFooId> : Laa<TFooId>
{
    public Foo<TFooId> Method() { ... }
}

(当然,您可以在任何适当的地方应用类型:字段,属性类型等)

即。而不是使用两个类型参数对BaseClass类型进行编码,只需使用唯一定义您正在使用的Foo<TFooId>基类的有趣/有用元素的那个,然后使用该基类型而不是更多派生IntFoo

在您的示例中,您对TFoo类没有约束,因此,BaseClass<TFoo, TFooId>无论如何都能够使用Foo<TId>中的基类型类成员。但即使您的意思是将TFoo约束为Foo<TFooId>,您似乎也不需要指定该类型。

如果上述内容无效,那么您需要在问题中添加更多细节,以准确解释所需内容。还要考虑一下,很可能人们已经走上了这条道路,如果你更少地表达你的问题,你需要的思考的实施机制,你可以用更高的层次来表达它,你可能会可能会发现有关Stack Overflow的现有问题或其他已解决这个更广泛问题的文章。

至少,如果您自己无法找到此类引用,那么以这种方式表达您的问题可能会更快地产生更好的答案。

另见XY Problem