Übergabe von Konstruktorargumenten an generische Typen in C#
Das Erstellen von Instanzen generischer Typen mit parametrisierten Konstruktoren in C# kann eine Herausforderung darstellen. Der Versuch einer direkten Instanziierung führt häufig zu der Fehlermeldung: „Beim Erstellen einer Instanz einer Variablen können keine Argumente bereitgestellt werden.“ Dies liegt daran, dass der Compiler zur Kompilierungszeit die spezifische Konstruktorsignatur nicht kennt.
Die new()
-Einschränkung erlaubt nur parameterlose Konstruktoren. Um Konstruktoren mit Argumenten zu verarbeiten, besteht eine gängige Lösung in der Verwendung einer Factory-Methode (häufig dargestellt als Delegate).
So können Sie das erreichen:
Anstatt den generischen Typ direkt zu instanziieren, übergeben Sie einen Delegaten (z. B. ein Func
) an Ihre generische Methode. Dieser Delegat fungiert als Factory und ist für die Erstellung des Objekts mit den erforderlichen Konstruktorargumenten verantwortlich.
Beispiel:
<code class="language-csharp">public static string GetAllItems<T>(..., Func<ListItem, T> factoryMethod) { // ... List<T> tabListItems = new List<T>(); foreach (ListItem listItem in listCollection) { tabListItems.Add(factoryMethod(listItem)); } // ... }</code>
Diese GetAllItems
-Methode akzeptiert jetzt einen Func<ListItem, T>
-Delegierten. Dieser Delegat nimmt ein ListItem
als Eingabe und gibt eine Instanz vom Typ T
.
Verwendung:
<code class="language-csharp">GetAllItems<Foo>(..., l => new Foo(l)); </code>
In diesem Beispiel dient der Lambda-Ausdruck l => new Foo(l)
als Factory-Methode. Es nimmt ein ListItem
(l
) und verwendet es, um mit dem Konstruktor von Foo
ein neues Foo
-Objekt zu erstellen. Dadurch wird das ListItem
-Argument effektiv an den Foo
-Konstruktor übergeben.
Dieser Ansatz ermöglicht eine flexible Instanziierung generischer Typen, auch solcher mit parametrisierten Konstruktoren, indem die Objekterstellungslogik von der generischen Methode selbst getrennt wird.
Das obige ist der detaillierte Inhalt vonWie kann ich beim Instanziieren eines generischen Typs in C# Argumente an einen Konstruktor übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!