Working-around fehlender partieller generischer Typ-Inferenz mit Constraints

8

Ich habe eine Schnittstelle (die von Repositories verwendet wird), die dieses Mitglied hat:

%Vor%

Damit kann der Aufrufer einen Entitätstyp ( T ) und den Typ seines Id -Feldes ( TId ) angeben. Der Implementierer dieser Schnittstelle würde dann die Entitäten vom Typ T finden und den Parameter id verwenden, um sie nach ihrer ID zu filtern (die in IEntity<TId> definiert ist).

Momentan nenne ich es so:

%Vor%

Idealerweise würde ich das gerne tun:

%Vor%

Ich habe die Antworten für diese Frage gelesen:

Teilweise generische Inferenz in C # möglich?

Ich verstehe, dass ich die Syntax, die ich will, nicht bekommen kann, aber mir nahe kommen kann. Ich kann es in meinem Fall jedoch nicht richtig einrichten, da meine generischen Parameterabhängigkeiten bestehen.

Folgendes habe ich bisher:

%Vor%

Der Kompilierungsfehler, den ich bekomme, ist:

The type 'T' cannot be used as type parameter 'T' in the generic type or method 'PartsLegislation.Repository.IDataContext.FindById<T,TId>(TId)'. There is no implicit reference conversion from 'T' to 'PartsLegislation.Repository.IEntity<TId>'.

Ich verstehe, was es sagt, denn die T in meiner Wrapper-Klasse ist nur als Referenztyp gedacht, aber die Funktion FindById möchte, dass sie IEntity<TId> ist, aber ich kann das nicht als TId ist in der Methode (sonst bin ich wieder bei Platz eins).

Wie kann ich dieses Problem umgehen (oder kann ich nicht)?

    
George Duckett 10.05.2013, 09:55
quelle

1 Antwort

4

Das kann nicht wie üblich funktionieren, weil Sie den Compiler der TId Einschränkung nach der Tat nicht überzeugen können. Sie können jedoch die Reihenfolge umkehren, d. H.

%Vor%

Nicht so elegant, aber es funktioniert. Implementierung:

%Vor%

Vorbehalt: Es ist wahrscheinlich einfacher, nur beide Parametertypen explizit anzugeben.

    
Marc Gravell 10.05.2013, 10:08
quelle

Tags und Links