2012-03-28 3 views
0

Ich habe diese Methode eine generische Repository aus einem Wörterbuch zu erhalten:Wie diese Methode neu zu schreiben, eine generische Repository zu bekommen Generika verwenden

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; 
} 

Das funktioniert, aber ich mag es mit Generika arbeiten, so habe ich versucht, :

public IRepository<T> GetRepository<T>() where T : class 
{ 
    var typeParameterType = typeof(T); 

    if (this._repositories.ContainsKey(typeParameterType)) { 
     return this._repositories[typeParameterType]; 
    } 
    return null; 
} 

Aber ich erhalte eine Fehlermeldung wie ‚konvertieren nicht implizit Typ IRepository zu IRepository<T> können. Eine explizite Konvertierung existiert (fehlt Ihnen ein Cast?)

Weiß jemand, wie man das löst?

Antwort

2

Wie der Fehler schon sagt, müssen Sie entweder GetRepository ‚s Rückgabetyp ändern, um die nicht-generic IRepository:

public IRepository GetRepository<T>() where T : class 
{ 
    var typeParameterType = typeof(T); 

    if (this._repositories.ContainsKey(typeParameterType)) 
     return this._repositories[typeParameterType]; 

    return null; 
} 

Oder einfach werfen die Rückkehr von this._repositories zu gattungs 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; 
} 

Oder vielleicht besser geeignet:

public IRepository<T> GetRepository<T>() where T : class 
{ 
    Repository<T> rep = null; 

    this._repositories.TryGetValue(typeof(T), out rep); 

    return rep; 
} 
0

Ändern Sie Ihren Rückgabetyp von IRepository<T> in einfach IRepository, um den Rückgabetyp Ihrer ursprünglichen nicht-generischen Methode zu entsprechen.

0

Der Rückgabetyp sollte IRepository sein (beachten Sie das Fehlen von <T>), da IRepository in der Wörterbuchdefinition nicht generisch ist.

1

Ihr Wörterbuch hat eine Art IRepository. Wenn Sie also ein Element zurückziehen, hat es auch diesen Typ. Auf der anderen Seite erwartet Ihre Methode, dass Sie den Wert IRepository<T> zurückgeben.

Es gibt zwei Möglichkeiten, dies zu beheben. Ändern Sie entweder den Rückgabetyp Ihrer Methode in IRepository, oder konvertieren Sie das Element in IRepository<T>, bevor Sie es zurückgeben:

return (IRepository<T>)this._repositories[typeParameterType]; 
Verwandte Themen