如何重写这种获取通用存储库以使用泛型的方法

时间:2012-03-28 02:46:37

标签: c# generics

我有这种方法从字典中获取通用存储库:

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>。存在显式转换(您是否错过了演员?)

有人知道如何解决这个问题吗?

4 个答案:

答案 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在字典的定义中不是通用的。