2010-08-11 75 views
2

我正在构建一个实体库,我有一个接口,IIdentifiable<T>。因此,例如,由Guids标识的实体实施IIdentifiable<Guid> with public Guid Id { get; }。到现在为止还挺好。冗余泛型参数?

我有一个接口IRepository<T, TIdentifier> where T : IIdentifiable<TIdentifier>

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

我在类似'IRepository<T> where T : IIdentifiable<T.GenericArgs[0]>之后。

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

回答

2

T没有限制,这要求它是一个通用的。并且没有什么能够阻止班级实施IIdentifiable<T1>,IIdentifiable<T2>,... IIdentifiable<Tn>,所以即使一些语法“接口的第一个参数由T实现”也是不够的。

0

基于假定类型已经满足该限制,您可以指定一个限制,将编译器置于逻辑悖论中。

此外,您的计划使TIdentifier未知在IRepository其中,我认为它将需要知道。

1

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

然后你就可以通用参数的数量减少到1,像这样:

IRepository<T> where T : IIdentifiable 

在实践中,你会再使用IRepository<X>X : IIdentifiable<Guid>

这是假设你的IRepository主要是兴趣的能力T有一把钥匙,并且不专注于特定类型的钥匙。

+0

事情是通用的Id属性会隐藏非通用的一个 – 2010-08-13 11:52:36

+0

嗯,因为它们是接口,它不是'真正'隐藏。据推测,非通用的显式实现将只是调用通用的Id属性 – cordialgerm 2010-08-19 07:00:01