Generika ohne neues ()

7

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?

    
Peter Trevor 26.01.2012, 19:01
quelle

4 Antworten

3

Ein weiterer Weg könnte sein, die Reflexion um den Preis der Kompilierzeitprüfung und der Leistungsminderung mit einzubeziehen:

%Vor%

Beachten Sie, dass dies auch funktioniert, wenn die Entitäten keinen gemeinsamen Vorgänger haben

    
vc 74 26.01.2012, 19:13
quelle
15

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%     
Jon Skeet 26.01.2012 19:06
quelle
1

Ein Beispiel für die Factory-Method-Lösung von @JohnSaunders:

%Vor%     
Chris Shain 26.01.2012 19:06
quelle
1

Sie können so etwas tun:

%Vor%     
Alex Mendez 26.01.2012 19:21
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '420181',
    'url' => 'generics-without-new',
];

$_SESSION = [
    '__flash' => [],
];