C# - Vorlagen und spezielle Konstruktoren
Habe ich eine Reihe von Klassen, die alle in der Lage sein constructored mit einem argument wird eine Instanz einer bestimmten Schnittstelle. Da Sie alle konstruiert werden kann, indem das gleiche Objekt (und der Prozess, bei dem diese Konstruktion passiert, ist weitgehend die gleiche in allen Fällen), ich dachte mir, vielleicht templating funktionieren würde. Im Grunde möchte ich etwas wie das hier tun:
public static void dostuff<T, U> (List<T> items)
{
foreach (T item in items)
{
func(new U(item).SpecialMember);
}
}
Natürlich, dass sich nicht kompilieren, da U
ist Vorlagen und somit fehlt SpecialMember
sowie die T
Konstruktor.
Grundsätzlich werden alle vorliegenden Implementierung der Schnittstelle T
hat bestimmte Eigenschaften. U
ist eine Implementierung von T which has an additional feature that is needed *and* which can be constructed from an any instance of
U`.
Rat?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider während Einschränkungen erhalten Sie einige der Art und Weise, es gibt keine Möglichkeit, festzulegen, dass ein Typ einen Konstruktor, der nimmt bestimmte argument: der einzige Konstruktor können Sie verlangen, ist eine parameterlose ein.
Persönlich würde ich mag, um zu sehen, dass Veränderung mit einer Idee von "static interfaces" (nur geeignet für Typ-Einschränkungen), aber für den moment die beste die du bekommen wirst ist eine Art Fabrik oder Reflexion - oder möglicherweise einen parameterlosen Konstruktor und eine "Init" - Methode in der Schnittstelle. Keine von diesen sind nette Optionen, ehrlich gesagt.
Können Sie hinzufügen Einschränkungen der generischen Parameter, die Ihnen erlauben, Zugriff SpecialMember zum Beispiel:
Du willst ein Fabrik Muster. Fügen Sie eine factory-Methode, um Ihre T-Schnittstelle zurückgibt, die U-Typen.
Du nicht, dass Generika verwendet werden, um erstellen Sie ein Objekt wie dieses. Sie können die Einschränkung der generischen Typen, etwa so:
Aber dies wird nur der Zugriff auf die Elemente dieser Klassen/interfaces keine Konstruktoren.
Erweitern Joel beantworten, sollten Sie eine Methode hinzufügen, die T-Schnittstelle (in meinem Beispiel, SomeClass), die in ein T-Objekt und gibt eine neue U-Objekt. So etwas wie die folgenden:
Als völlig anderen Ansatz, könnten Sie angeben, dass die Methode doStuff dauert
Func<T, U>
wie gut, das soll zu schaffen, ein U von T-Objekt.Diese bekommt unordentlich, wenn Ihre Objekt-Erstellung ist etwas komplizierter als ein einfaches lamba wie
t => new U(t)