Implementieren von Multiparameter-C ++ - Vorlage wie Verhalten bei C # mithilfe von Richtlinienmuster

8

Ich versuche, eine C ++ - ähnliche Vorlage mit C # -Generika und einem Richtlinienmuster basierend auf dieser Antwort zu implementieren

>

Dies ist ein Beispiel für das Muster:

%Vor%

Mein beabsichtigtes Verhalten ist wie folgt:

%Vor%

Aber ich konnte bisher .net Generic Extension mit weniger Argumenten als Parametern nicht akzeptieren.

>

Ich kann die Schnittstelle explizit aufrufen, was schrecklich ist, um den Zweck all dieser Dinge zu vereiteln.

%Vor%

Ich dachte daran mit einem Wrapper zu arbeiten:

%Vor%

Der Wrapper kann jedoch nicht beide Typen für die Wrapped-Funktion auflösen, was mit folgendem Fehler fehlschlägt:

  

Fehler 1 Der Typ 'MyClass' kann nicht als Typparameter 'P' verwendet werden   im generischen Typ oder in der Methode   'MyClassExtension.wrappedDoSomething (P, U)'. Es gibt kein   implizite Referenzkonvertierung von 'MyClass' zu   'ISomePolicy'

Irgendwelche Einsichten, um das Problem der Parameter zu beheben oder all dies neu zu gestalten, sind willkommen.

Für den Kontext würde dies verwendet werden, um I / O-Übersetzer einzubinden. T wäre in meinem Fall das Ziel-E / A-Format und U die Objektdarstellung der Daten, die von meinem Framework verwendet werden.

Ich bin mir bewusst, dass dies leicht mit Delegaten oder Schnittstellen erreicht werden kann, aber das Ziel ist, dass der Framework-Benutzer die gewünschte Übersetzung leicht instanziiert, und wenn eine Implementierung nicht existiert, kann sie trivial zu einer gemeinsamen Schnittstelle hinzugefügt werden .

BEARBEITEN: Das Auflösen einer generischen Methode aus einer anderen generischen Methode / Klasse scheint auf Mono nicht zu funktionieren.

    
xvan 16.03.2016, 22:33
quelle

2 Antworten

3

Normalerweise sollten Richtlinien keine Daten enthalten. Zum Beispiel

%Vor%

Wenn Sie Richtlinien und Daten kombinieren möchten, können Sie eine andere Schnittstelle in Erwägung ziehen

%Vor%

Oder eine Kombination dieser beiden Konzepte

%Vor%

Verwendung:

%Vor%     
Sergey Shandar 21.03.2016 18:35
quelle
3

Sie haben Ihren Code versucht, aber selbst einfache Anrufe funktionierten nicht ohne weiteres. Hauptproblem ist, dass MyClass den unbekannten Elementtyp 'myEement' enthält - dieser Typ kann nicht aus Funktionsaufrufparametern abgeleitet werden. Wenn Sie jedoch eine Verallgemeinerung vornehmen und den Objekttyp weglassen, funktioniert Ihr Beispiel sofort:

%Vor%

Was ist mit myEement (oder du meintest wahrscheinlich meinElement) - du kannst es bei Bedarf zur Laufzeit bekommen.

%Vor%

Allerdings kann die Reflektion Ihre Ausführung immer verlangsamen. Wenn Sie nicht beabsichtigen, eine sehr schwere Klassenhierarchie mit einer großen Anzahl von Instanzen zu erstellen, sollte dies für Ihre Anforderungen ausreichen.

    
TarmoPikaro 06.04.2016 15:26
quelle