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



我知道标题可能有点不清楚,所以我会解释我要做什么。

请注意,这更多是出于围绕语言能力的教育原因。换句话说如果这是可能的,而不是应该是这样的方法。

考虑以下通用类:

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

现在根据上述考虑具体的子类。这是使用" int"one_answers" string" ...

的两个示例
public class IntFoo : Foo<int>
{
}
public class StrFoo : Foo<string>
{
}

,最后是将foo作为类型参数的通用,并从laa继承,该laa从foo中获取其类型参数。

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

这是您根据int和字符串进行操作的方式,但是除了Intfoo和strfoo之外,我还必须明确定义INT和FOO ...

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

请注意,这些"最终"类是具有自己属性的具体类型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"作为类型的指定器?

您无法基于C#规范做到这一点。类型推理当前仅适用于方法,并且不适用于类型(类似您的案例类)

打破您所需结果的第二个规则是您无法指定一个通用类型参数并推断另一个参数,它是提供全部或推断所有方法的所有情况。

c#规格:

1.6.3类型参数

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

您的问题不是很具体,尚不清楚实际的约束和要求是什么。就是说&hellip;

类型推理仅用于通用方法而不是通用类型的推理。因此,从字面上看,答案是否定的,没有办法推断这种类型。

可能对您有用的是在类定义中使用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>上,似乎您实际上都不需要指定该类型。

如果上述没有用,则需要在问题中添加更多详细信息,以准确解释需要什么。还要考虑一下,人们可能已经走了这条路,如果您对实施机制的疑问少,您需要的您需要的,您就可以在更高级别上表达它,您可能会可能在堆栈溢出或其他已经解决了更广泛问题的文章上找到现有的问题。

至少,如果您自己找不到此类参考,以表达您的问题可能会更快地产生更好的答案。

另请参阅XY问题。

最新更新