2010-02-16 61 views
2

我正在考虑在决定业务线库之前实现按对象存储库(例如Person存储库,State存储库等)相反,但我仍然有一个关于通过一个ID(标识符)类型与一个通用的问题。如何指定泛型类型的标识符类型(用于db查询)以及genric类型

简而言之,一个人可能有一个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是类(人,国家等),我的意图是让TID是用于标识类型,即查看T Get(TID id)。

这样做会产生编译错误:“类型'字符串'不能用作泛型类型或方法'DumpWebApp.IRepository'中的类型参数'TID'。'string'没有隐式引用转换。 '系统类型'。”

这样做的另一种方法是将实际的元素传递给Get和Delete方法,我猜,但看起来有点笨拙。

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

迈克K.

回答

2

刚落where TID : Type约束。这应该够了吧。

+0

好的,这就像一个魅力,我认为这是变化?谢谢你的指针:-) – 2010-02-16 12:58:38

+0

@Mike:不,与方差无关。使用'Type'作为通用约束不是“任何类型”的简写。 'System.Type'是它自己的独特类。如果你想允许任何类型的'TID',那么就完全跳过这个约束。 – LukeH 2010-02-16 13:14:20

+0

好的,那么<>中的第二个参数究竟代表什么?我猜这是通用的类型,很明显,但想知道这个问题... – 2010-02-16 14:02:05

1

IQueryable no。 IList是的。数组是肯定的。 IList是安全的。

你的TID约束是说TID将是Type类型。

下降。

+0

大声笑。猜我应该加载答案 – 2010-02-16 12:52:26

+0

我不能相信它得到答案,很快! :-s你们在FIRE :-) – 2010-02-16 13:37:10