Aufrufen einer generischen Methode mit dem richtigen abgeleiteten Typ

8

Ich habe folgendes Szenario:

Ich habe drei Klassen, nennen wir sie A , B und C . Sie haben nur gemeinsam, dass sie von der gleichen Schnittstelle, ISomeInterface , erben und dass es sich um Klassen handelt, die Entitäten mit Entity Framework zugeordnet sind.

Ich habe eine Methode, die eine Liste von Objekten erhalten hat, die diese Schnittstelle implementiert, aber die Objekte selbst sind Instanzen von A , B oder C .

Die Methoden-Shell sieht so aus

%Vor%

Nun ist das Problem mit der Methode ProcessEntity . Dies ist eine generische Methode, die die Tabelle der übereinstimmenden Elemente entsprechend dem Typ oder der Entität aus der Datenbank abrufen muss, sodass sie wie folgt aussieht:

%Vor%

Das Problem ist, dass die Zeile var set = repository.Set<T>(); fehlschlägt, weil T in diesem Fall ISomeInterface ist, und nicht der tatsächliche Typ ( A , B oder C ), so dass es eine Ausnahme gibt Es kann sich nicht auf den angegebenen Typ beziehen, was verständlich ist.

Meine Frage ist also: Wie kann ich ProcessEntity mit dem tatsächlichen Typ des Objekts in der Liste aufrufen und nicht mit dem Schnittstellentyp, den sie implementiert?

    
Øyvind Bråthen 31.05.2012, 09:31
quelle

3 Antworten

13

Sie können das Schlüsselwort dynamic anwenden, wenn Sie die Entity an ProcessEntity übergeben. In diesem Fall wird der tatsächliche Entitätstyp zur Laufzeit ermittelt.

%Vor%     
Sergey Berezovskiy 31.05.2012 09:33
quelle
2

Nun können Sie einen Besucher-ähnlichen Trick machen und die folgende Problemumgehung verwenden:

  1. Definieren Sie eine Methode Process(EntityProcessor ep) in ISomeInterface
  2. Implementiere es in A genauso wie ep.ProcessEntity<A>(this) (und genauso in B und C )
  3. Anstelle von ProcessEntity(entity) in Ihrer Schleife rufen Sie einfach entity.Process(this) .
  4. auf

(die Methodennamen sind vielleicht nicht am saubersten, aber Sie sollten die Idee bekommen)

    
Vlad 31.05.2012 09:38
quelle
2

Sie können reflection verwenden, um die generische Methodendefinition zu erhalten und sie dann aufzurufen, zB:

%Vor%

Sie können die Methode nach Typ zwischenspeichern, und Sie können sie zur Laufzeit mit einer Art Delegate-Factory kompilieren, wenn die Leistung kritisch ist.

Alternativ können Sie auch das Besuchermuster

verwenden     
Martin Ernst 31.05.2012 09:39
quelle

Tags und Links