Instanziierung generischer C#-Typen und Konstruktorparameter
Beim Erstellen eines generischen Typs stellt sich häufig die Frage: Wie instanziiert man einen Konstruktor, der Parameter in einer generischen Methode erfordert? Beispielsweise verfügt die Klasse BaseFruit
über einen Konstruktor, der einen Gewichtsparameter vom Typ Integer empfängt.
Wie kann man Früchte mit einem bestimmten Gewicht in einer generischen Methode instanziieren?
Der folgende Code versucht, eine Fruchtinstanz mit einem angegebenen Gewicht in einer generischen Methode zu erstellen:
<code class="language-csharp">public void AddFruit<T>() where T : BaseFruit { BaseFruit fruit = new T(weight); /*new Apple(150);*/ fruit.Enlist(fruitManager); }</code>
Dieser Ansatz ist nur möglich, wenn BaseFruit
über einen parameterlosen Konstruktor verfügt, der die Eigenschaften anschließend über Mitgliedsvariablen ändert. In realen Anwendungen ist dies jedoch möglicherweise nicht praktikabel.
Alternative:
kann die Klasse Activator
verwenden:
<code class="language-csharp">return (T)Activator.CreateInstance(typeof(T), new object[] { weight });</code>
In diesem Fall stellt die T
-Einschränkung für new()
sicher, dass zur Kompilierungszeit ein öffentlicher Parameterloser Konstruktor vorhanden ist und die Activator
-Klasse für die eigentliche Typerstellung verantwortlich ist.
Hinweis:
Während dieses Szenario eine Problemumgehung darstellt, muss die Existenz des spezifischen Konstruktors im Code überprüft werden. Darüber hinaus kann die Verwendung dieses Ansatzes auf ein Problem auf Codeebene hinweisen und sollte in aktuellen Versionen von C# vermieden werden.
Das obige ist der detaillierte Inhalt vonKann die generische Typinstanziierung Konstruktorargumente in C# verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!