我有这种方法从字典中获取通用存储库:
public readonly IDictionary<Type, IRepository> _repositories = new Dictionary<Type, IRepository>();
public IRepository GetRepository(Type type)
{
if (this._repositories.ContainsKey(type)) {
return this._repositories[type];
}
return null;
}
这有效,但我希望它能使用泛型,所以我尝试了:
public IRepository<T> GetRepository<T>() where T : class
{
var typeParameterType = typeof(T);
if (this._repositories.ContainsKey(typeParameterType)) {
return this._repositories[typeParameterType];
}
return null;
}
但我收到错误消息,例如'无法将类型IRepository
隐式转换为IRepository<T>
。存在显式转换(您是否错过了演员?)
有人知道如何解决这个问题吗?
答案 0 :(得分:2)
如错误所示,您需要将GetRepository
的返回类型更改为非通用IRepository
:
public IRepository GetRepository<T>() where T : class
{
var typeParameterType = typeof(T);
if (this._repositories.ContainsKey(typeParameterType))
return this._repositories[typeParameterType];
return null;
}
或者,只需将this._repositories
的返回值转换为通用类型IRepository<T>
:
public IRepository<T> GetRepository<T>() where T : class
{
var typeParameterType = typeof(T);
if (this._repositories.ContainsKey(typeParameterType))
return this._repositories[typeParameterType] as IRepository<T>;
return null;
}
或者可能更合适:
public IRepository<T> GetRepository<T>() where T : class
{
Repository<T> rep = null;
this._repositories.TryGetValue(typeof(T), out rep);
return rep;
}
答案 1 :(得分:1)
您的词典有一种IRepository。因此,当您撤回元素时,它也具有此类型。另一方面,您的方法希望您返回IRepository<T>
类型的值。
有两种方法可以解决这个问题。要么将方法的返回类型更改为IRepository,要么在返回之前将元素转换为IRepository<T>
:
return (IRepository<T>)this._repositories[typeParameterType];
答案 2 :(得分:0)
将您的返回类型从IRepository<T>
更改为简单IRepository
,以匹配原始非通用方法的返回类型。
答案 3 :(得分:0)
返回类型应为IRepository
(注意缺少<T>
),因为IRepository在字典的定义中不是通用的。