【问题标题】:How to specify a generic type's identifier type (for db queries) along with genric type如何指定泛型类型标识符类型(用于数据库查询)以及泛型类型
【发布时间】:2010-02-16 20:52:03
【问题描述】:

在决定使用业务线存储库之前,我正在考虑实施一个针对每个对象的存储库(例如,个人存储库、状态存储库等),但我仍然对传入 ID(标识符)有疑问使用泛型类型。

简而言之,一个人可能有一个 GUID 标识符,一个州/县可能有一个 int 标识符,等等。考虑到这一点,我如何传递一个指定 ID 的类型,呃,泛型的类型被传入?

这是我在界面上的尝试:

public interface IRepository<T, TID> where T : class where TID : Type
{        
    T Get(TID id);
    IList<T> GetAll();
    void Update(T entity);
    void Insert(T entity);
    void Delete(TID id);
}

您可以看到 T 是类(Person、State 等),我的意图是让 TID 成为用于标识符的类型,即查看 T Get(TID id)。

这会导致编译错误:“类型'string'不能用作泛型类型或方法'DumpWebApp.IRepository'中的类型参数'TID'。没有从'string'到'的隐式引用转换System.Type'。”

我猜另一种方法是将实际元素传递给 Get 和 Delete 方法,但这似乎有点笨拙。

感谢您的任何建议 - 顺便说一下,GetAll() 是否可以接受返回 IList?为什么不是 IQueryable 或 T[] ?

迈克·K。

【问题讨论】:

    标签: c# generics repository


    【解决方案1】:

    只需删除 where TID : Type 约束即可。这应该可以解决问题。

    【讨论】:

    • 好吧,这就像一个魅力,我认为这是变异?谢谢你的指点:-)
    • @Mike:不,与方差无关。使用Type 作为通用约束并不是“任何类型”的简写。 System.Type 是它自己独特的类。如果您想允许 TID 的任何类型,则完全跳过约束。
    • 好的,那么 中的第二个参数实际上代表什么?我猜这是泛型的类型,显然,但想知道 fer shure ...
    【解决方案2】:

    IQueryable 编号是的。数组是取决于。 IList 是安全的。

    您的 TID 约束表明 TID 的类型为 Type。

    放下那个。

    【讨论】:

    • 我不敢相信它会这么快得到答复! :-s 你们着火了 :-)
    猜你喜欢
    • 2019-07-21
    • 1970-01-01
    • 2022-10-14
    • 2019-11-04
    • 2019-05-30
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多