本文探讨如何在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>
然而,这种方法通常不被推荐,因为它可能导致与泛型类型中构造函数要求相关的代码异味。
以上是可以在 C# 中实例化具有参数化构造函数的泛型类型吗?的详细内容。更多信息请关注PHP中文网其他相关文章!