Heim >Backend-Entwicklung >C++ >Können generische Typen mit parametrisierten Konstruktoren in C# instanziiert werden?

Können generische Typen mit parametrisierten Konstruktoren in C# instanziiert werden?

Barbara Streisand
Barbara StreisandOriginal
2025-01-09 12:17:41819Durchsuche

Generische C#-Typen und Instanziierung parametrisierter Konstruktoren

In diesem Artikel wird untersucht, wie ein generischer Typ mit einem parametrisierten Konstruktor in C# instanziiert wird.

Angenommen, es gibt eine generische Methode zum Hinzufügen von Früchten zum Obstmanager:

<code class="language-csharp">public void AddFruit<T>() where T : BaseFruit
{
    BaseFruit fruit = new T(weight); // 例如:new Apple(150)
    fruit.Enlist(fruitManager);
}</code>

wobei die Klasse BaseFruit einen Konstruktor hat, der eine Ganzzahl weight als Parameter akzeptiert.

Frage: Können wir in dieser generischen Methode ein Fruchtobjekt mit einem bestimmten Gewicht instanziieren?

Antwort: Ja, aber nicht direkt wie im Beispiel. Es gibt zwei Methoden:

1. Verwenden Sie die Activator-Klasse:

Mit der Klasse Activator können wir ein Objekt vom Typ T dynamisch instanziieren und die erforderlichen Parameter als Array von Objekten übergeben:

<code class="language-csharp">return (T)Activator.CreateInstance(typeof(T), new object[] { weight });</code>

Beachten Sie, dass dies erfordert, dass die Klasse BaseFruit über einen öffentlichen, parameterlosen Konstruktor verfügt, den der Compiler überprüfen kann. In Wirklichkeit wird jedoch die Klasse Activator zum Erstellen der Instanz verwendet.

2. Verwenden Sie generische Parameter mit dem Konstruktor:

C# schränkt die Verwendung von Konstruktoren ein, die Parameter zum Instanziieren generischer Typen erfordern. Um dieses Problem zu umgehen, können Sie einen generischen Parameter mit demselben Namen wie der Typ erstellen und den Konstruktorparameter in seiner Definition angeben:

<code class="language-csharp">public void AddFruit<T>(T fruit) where T : new(int weight)
{
    fruit.Enlist(fruitManager);
}

// 使用示例:
AddFruit(new Apple(150));</code>

Dieser Ansatz wird jedoch im Allgemeinen nicht empfohlen, da er zu Codegerüchen im Zusammenhang mit Konstruktoranforderungen in generischen Typen führen kann.

Can Generic Types with Parameterized Constructors Be Instantiated in C#?

Das obige ist der detaillierte Inhalt vonKönnen generische Typen mit parametrisierten Konstruktoren in C# instanziiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn