首頁 >後端開發 >C++ >可以在 C# 中實例化具有參數化建構函數的泛型類型嗎?

可以在 C# 中實例化具有參數化建構函數的泛型類型嗎?

Barbara Streisand
Barbara Streisand原創
2025-01-09 12:17:41775瀏覽

C#泛型型別及帶參數建構子的實例化

本文探討如何在C#中實例化具有參數化建構子的泛型類型。

假設有一個泛型方法,用於向水果管理器添加水果:

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

其中BaseFruit類別具有一個需要整數weight作為參數的建構子。

問題: 我們能否在這個泛型方法中,使用特定重量實例化一個水果物件?

答案: 可以,但不能直接像範例。有兩種方法:

1. 使用Activator類別:

利用Activator類,我們可以動態實例化類型為T的對象,並將所需參數作為對象數組傳遞:

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

請注意,這需要BaseFruit類別具有一個公共的無參數建構函數,以便編譯器進行檢查,但實際上它使用Activator類別來建立實例。

2. 使用帶建構子的泛型參數:

C#限制了使用需要參數的建構子來實例化泛型類型。作為變通方法,您可以建立一個與類型同名的泛型參數,並在其定義中指定建構函式參數:

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

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

然而,這種方法通常不被推薦,因為它可能導致與泛型類型中建構函數要求相關的程式碼異味。

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

以上是可以在 C# 中實例化具有參數化建構函數的泛型類型嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn