代码之家  ›  专栏  ›  技术社区  ›  James L

多余的泛型参数?

  •  2
  • James L  · 技术社区  · 16 年前

    我正在建立一个实体库,我有一个接口, IIdentifiable<T> . 例如,由guid标识的实体 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 回复  |  直到 16 年前
        1
  •  2
  •   Ben Voigt    16 年前

    没有限制 T 这就要求它是通用的。没有什么能阻止类实现 IIdentifiable<T1> , IIdentifiable<T2> ,… IIdentifiable<Tn> ,甚至有些语法说 IIdentifiable'1 接口实现者 T “还不够。

        2
  •  1
  •   cordialgerm    16 年前

    你可以创建一个 IIdentifiable 那有 object Id { get; } 然后有 IIdentifiable<T> : IIDentifiable 具有泛型ID属性。

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

    IRepository<T> where T : IIdentifiable
    

    实际上你会用 IRepository<X> 具有 X : IIdentifiable<Guid>

    这假设您的雇员主要对t拥有密钥的能力感兴趣,而不是关注特定类型的密钥。

        3
  •  0
  •   James Curran    16 年前

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

    而且,你的计划 TIdentifier 内部未知 IRepository 我想它需要知道。