我正在尝试一些工厂类型代码,其中 BuildIt 函数仅根据传入的泛型类型返回具体类型。泛型类型仅限于 BaseAbstract 类的后代。
Buildit 函数只需要泛型类型和参数列表(在创建具体类时,这些参数在 BuildIt 函数中用作构造函数参数)。
下面的示例代码按预期工作(打印“A”然后“B”)
但是如果我尝试调用类似的东西,就会出现问题:
var b = fs.BuildIt<B>("B", "C");
由于 B 类没有带有 2 个参数的构造函数,因此在运行时会失败。
是否可以做这样的事情,除了在编译时失败?如果没有,是否有另一种方法来解决这个问题,以便可以进行编译时检查(如果所有这些都必须被丢弃并开始完全不同的事情并不重要)
示例代码
public abstract class BaseAbstract
{
public string Name ="";
public override string ToString ()
{
return Name;
}
}
public class A : BaseAbstract
{
public A()
{
Name = "A";
}
}
public class B : BaseAbstract
{
public B()
{
}
public B(string param)
{
Name = param;
}
}
public class Factory
{
public T BuildIt<T>(params object[] args) where T : BaseAbstract, new()
{
T x = (T)Activator.CreateInstance(typeof(T), args);
return x;
}
}
public class MainClass
{
public static void Main (string[] args)
{
//These are fine
Factory fs = new Factory();
var a = fs.BuildIt<A>();
var b = fs.BuildIt<B>("B");
Console.WriteLine (a);
Console.WriteLine (b);
//This would cause runtime error because of the "C" paramter
//var b2 = fs.BuildIt<B>("B", "C");
}
}