我正在考虑在决定业务线库之前实现按对象存储库(例如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.
好的,这就像一个魅力,我认为这是变化?谢谢你的指针:-) – 2010-02-16 12:58:38
@Mike:不,与方差无关。使用'Type'作为通用约束不是“任何类型”的简写。 'System.Type'是它自己的独特类。如果你想允许任何类型的'TID',那么就完全跳过这个约束。 – LukeH 2010-02-16 13:14:20
好的,那么<>中的第二个参数究竟代表什么?我猜这是通用的类型,很明显,但想知道这个问题... – 2010-02-16 14:02:05