Ich habe ein Dutzend Methoden in meinem Projekt (C # 2.0), die so aussehen:
%Vor%... aber für verschiedene Entity-Klassen. (Okay, nicht ganz so trivial, ich habe den Code hier vereinfacht.)
Es sieht so aus, als wäre es ein guter Kandidat für Generika, und ich kam dazu:
%Vor%Und natürlich bekomme ich die "Kann keine Instanz des Typs Parameter 'T' erstellen, weil es nicht die neue () Einschränkung" Fehler.
Das Problem ist, dass diese 'Entity'-Klassen keinen öffentlichen parameterlosen Konstruktor haben, und auch keine Möglichkeit, die' row'-Daten nachträglich hinzuzufügen. Und da EntityBase Teil des Unternehmensrahmens ist, habe ich keine Kontrolle darüber (dh ich kann es nicht ändern).
Gibt es einen Weg dazu?
Eine einfache Möglichkeit besteht darin, eine Factory-Funktion bereitzustellen:
%Vor%und rufe mit:
%Vor%Allerdings ist es zu diesem Zeitpunkt komplizierter, als nur
aufzurufen %Vor%an erster Stelle ...
Es ist nicht wirklich klar, was Sie in Ihrem realen Kontext erreichen wollen, aber diese Art von Fabrik / Anbieter-Ansatz kann sicherlich zu anderen Zeiten nützlich sein. Beachten Sie, dass das Aufrufen eines Factory-Delegaten auch erheblich schneller sein kann als die Verwendung von new T()
mit einer Einschränkung, wie ich vor einiger Zeit gebloggt habe . Irrevelant in vielen Fällen, aber wissenswert.
EDIT: Für .NET 2.0-Kompatibilität müssen Sie den Delegaten selbst deklarieren, aber das ist einfach:
%Vor%Wenn Sie wirklich mit C # 2 verwenden (und nicht etwa mit C # 3 für .NET 2.0), können Sie auch keine Lambda-Ausdrücke verwenden, aber Sie können weiterhin anonyme Ausdrücke verwenden Methoden:
%Vor%Ein Beispiel für die Factory-Method-Lösung von @JohnSaunders:
%Vor%