C# 如何指定泛型类型';s标识符类型(用于db查询)以及genric类型

C# 如何指定泛型类型';s标识符类型(用于db查询)以及genric类型,c#,generics,repository,C#,Generics,Repository,在决定使用业务线存储库之前,我曾考虑过实现每个对象存储库(例如,个人存储库、状态存储库等),但我仍然有一个关于使用泛型传递ID(标识符)类型的问题 简而言之,一个人可能有一个GUID标识符,一个州/县可能有一个int标识符,等等。考虑到这一点,我如何传递一个类型来指定传入的泛型的ID,呃,类型 以下是我在界面上的尝试: public interface IRepository<T, TID> where T : class where TID : Type {

在决定使用业务线存储库之前,我曾考虑过实现每个对象存储库(例如,个人存储库、状态存储库等),但我仍然有一个关于使用泛型传递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);
}
公共接口i位置,其中T:class,其中TID:Type
{        
T获取(TID id);
IList GetAll();
无效更新(T实体);
无效插入(T实体);
作废删除(TID id);
}
您可以看到T是类(Person、State等),我的目的是让TID成为用于标识符的类型,即查看T Get(TID id)

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

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

感谢您的建议——顺便问一下,返回IList是否可接受GetAll()?为什么不能使用IQueryable或T[]


Mike K.

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

我的答案是否定的。我的答案是肯定的。数组是,取决于。它是安全的

您的TID约束表示TID将为类型


放下它。

好吧,这就像一个符咒,我想这就是变异?谢谢你的指点:-)@Mike:不,与差异无关。使用
Type
作为泛型约束并不是“任何类型”的简写<代码>系统。类型是它自己的独立类。如果您想为
TID
允许任何类型,那么只需完全跳过约束即可。好的,那么中的第二个参数实际代表什么?很明显,我猜这是一种通用型,但我想知道舒尔的情况……我不敢相信它这么快就得到了回答!:-s你们着火了:-)