有没有一种优雅的方法可以用参数实例化变量类型?
时间:2020-03-06 14:23:20 来源:igfitidea点击:
这是不合法的:
public class MyBaseClass { public MyBaseClass() {} public MyBaseClass(object arg) {} } public void ThisIsANoNo<T>() where T : MyBaseClass { T foo = new T("whoops!"); }
为此,我们必须对T的类型对象进行一些反射,或者必须使用Activator.CreateInstance。两者都很讨厌。有没有更好的办法?
解决方案
where T : MyBaseClass, new()
仅适用于无参数公共构造函数。除此之外,回到activator.CreateInstance(这还不错)。
没有。如果没有传递参数,则可以将类型参数约束为需要无参数构造函数。但是,如果我们需要传递参数,那么我们很不走运。
我看到那没用。
但是阻止我们执行此操作的原因是什么?
public void ThisIsANoNo<T>() where T : MyBaseClass { MyBaseClass foo = new MyBaseClass("whoops!"); }
由于所有内容都将从MyBaseClass继承,所以它们都将是MyBaseClass,对吗?
我试过了,这行得通。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ThisIsANoNo<MyClass>(); ThisIsANoNo<MyBaseClass>(); } public class MyBaseClass { public MyBaseClass() { } public MyBaseClass(object arg) { } } public class MyClass :MyBaseClass { public MyClass() { } public MyClass(object arg, Object arg2) { } } public static void ThisIsANoNo<T>() where T : MyBaseClass { MyBaseClass foo = new MyBaseClass("whoops!"); } } }
我们不能将T约束为具有空构造函数之外的特定构造函数签名,但可以将T约束为具有所需签名的工厂方法:
public abstract class MyBaseClass { protected MyBaseClass() {} protected abstract MyBaseClass CreateFromObject(object arg); } public void ThisWorksButIsntGreat<T>() where T : MyBaseClass, new() { T foo = new T().CreateFromObject("whoopee!") as T; }
但是,对于这种情况,我建议使用另一种创建模式,例如"抽象工厂"。