我正在构建一个实体存储库,我有一个接口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东西有这个呢?
答案 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
未知,我认为这是需要知道的。