冗余泛型参数?

时间:2010-08-11 14:37:24

标签: c# generics

我正在构建一个实体存储库,我有一个接口IIdentifiable<T>。因此,Guids标识的实体会实现IIdentifiable<Guid> with public Guid Id { get; }。到目前为止,非常好。

我的界面为IRepository<T, TIdentifier> where T : IIdentifiable<TIdentifier>

在我看来,TIdentifier泛型参数是多余的,因为已经信息保存在T的泛型参数中。有没有什么办法可以让我更清晰地实现IRepository,我只需要在我的中指定T商业代码?

我喜欢'IRepository<T> where T : IIdentifiable<T.GenericArgs[0]>

我怀疑这是可能的,但我想我会问。也许新的C#4东西有这个呢?

3 个答案:

答案 0 :(得分:2)

T没有约束要求它是通用的。并且没有什么可以阻止类实现IIdentifiable<T1>IIdentifiable<T2>,... IIdentifiable<Tn>,所以甚至一些语法说“IIdentifiable'1接口的第一个参数由{实现{1}}“还不够。

答案 1 :(得分:1)

您可以创建一个IIdentifiable object Id { get; },然后IIdentifiable<T> : IIDentifiable拥有通用的Id属性。

然后你可以将泛型参数的数量减少到1,如下所示:

IRepository<T> where T : IIdentifiable

在实践中,您可以将IRepository<X>X : IIdentifiable<Guid>

一起使用

这假设您的IRepository主要关注T拥有密钥的能力,而不是专注于特定类型的密钥。

答案 2 :(得分:0)

您要求能够根据类型已经满足该约束的假设指定约束,将编译器置于逻辑悖论中。

此外,您的计划会在TIdentifier内使IRepository未知,我认为这是需要知道的。