Ich bin ein generischer Abfrage Dispatcher bauen. Die Idee ist, wie folgt:Typ Rückschluss mit Schnittstellen und generischen Einschränkungen
- Eine generische Schnittstelle
IQuery<T>
die - Eine konkrete Abfrageklasse hat einige Getter und Setter (implementierende
IQuery<T>
) - Eine generische Schnittstelle
IQueryHandler<TReturnType, TQuery>
mit einer einzigen Methode ein Abfrageobjekt darstellt, erhält ein TQuery (mit einer Einschränkung aufTQuery: IQuery<TReturnType>
) und gibt einenTReturnType
- Lader Beton
IQueryHandler
Implementierung, die ein konkretesConcreteQuery
und gibt eine TQuery erhalten
- Eine
QueryDispatcher
, die eine einzige Methode hat, die eine Abfrage empfängt und ein Ergebnis zurückgibt. Die konkrete Klasse sucht den richtigen Handler aus einem DI-Container.
Das Problem ist, dass ich nicht Typinferenz, wenn ich die Fetch
Methode auf den QueryDispatcher
nennen. Gibt es etwas, was ich tun kann, um Typinferenz zu bekommen, oder ist das nur eine Einschränkung von C#?
In der Theorie sollte es wissen, was die Typargumente sind, da es einen Parameter TQuery
empfängt, der eine Beschränkung auf eine IQuery<TReturnType
hat.
Dies ist der Code:
class ConcreteClass // This is the class of which I want to query objects
{
}
Abfrage-Schnittstelle + Beton Abfrageklasse
interface IQuery<T>
{
}
public class ConcreteQuery : IQuery<ConcreteClass>
{
}
QueryHandler Schnittstelle + Beton Abfrage-Handler
interface IQueryHandler<TReturnType, TQuery> where TQuery : IQuery<TReturnType>
{
TReturnType Fetch(TQuery query);
}
class ConcreteQueryHandler : IQueryHandler<ConcreteClass, ConcreteQuery>
{
ConcreteClass Fetch(ConcreteQuery query)
{
}
}
QueryDispatcher (ein DI-Container verwendet zu lösen der richtige Handler)
class QueryDispatcher
{
TReturnType Fetch<TReturnType, TQuery>(TQuery query)
where TQuery : IQuery<TReturnType>
{
return myDIcontainer.Get<IQueryHandler<T, TQuery>>().Fetch(query);
}
}
Nun, wenn ich die QueryDispatcher wie diesen bekomme ich einen Fehler:
var queryDispatcher = new QueryDispatcher();
var c = queryDispatcher.Fetch(new ConcreteQuery());
Wenn ich die alles Typargumente liefern korrekt funktioniert:
var c = queryDispatcher.Fetch<ConcreteClass, ConcreteQuery>(new ConcreteQuery());
denke nicht, dass Sie andere Wahl haben, wie es jetzt nicht mehr kann, wie TReturnType zu lösen –
Die Frage ist, Ist das eine Einschränkung von C#? – Kenneth
@Kenneth Wenn Sie die 'var' in den echten Typ ändern, hilft es? –