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.
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%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.
Tags und Links c# generics implicit-conversion extension-methods template-specialization