可能重复:
Activator.CreateInstance - How to create instances of classes that have parameterized constructors
我想知道如何在不使用默认构造函数的情况下创建在运行时确定的类型的对象。
也就是说,我有BaseClass
和各种子类。
Type type; //this variable will be one of the child classes
BaseClass base = Activator.CreateInstance(type);
这允许我使用默认构造函数创建子类对象,但我想调用特定的构造函数。我知道所有子类都有一个构造函数采用某些参数,所以我不担心该构造函数不存在。我发现了this的问题,但我能得到的最好的是一个字符串参数。这可行吗?
答案 0 :(得分:3)
三个选项:
Type.GetConstructor
然后ConstructorInfo.Invoke
Activator.CreateInstance
。Dictionary<Type, Func<string, string, YourBaseType>>
或其他适当的第三个选项要求您在每次添加新类型时更改工厂代码 - 当然 - 但它只是一行。
我个人喜欢第一个选项,因为它给你最大的控制权(而不是依赖于Activator.CreateInstance
在执行时找到最佳匹配构造函数) - 如果这是对性能敏感的代码,你可以构建一个执行时委托的字典,通过发现构造函数,然后使用表达式树。 (据我所知,你不能使用Delegate.CreateDelegate
从构造函数构建委托,这有点烦人。)
答案 1 :(得分:2)
您可以使用Activator.CreateInstance(Type, Object[])
重载来执行此操作。它会根据提供的参数调用最合适的构造函数。
例如:
public class Test{
public Test(){
Console.WriteLine("Defaul ctor");
}
public Test(int i){
Console.WriteLine("Test(int)");
}
public Test(int i, string s){
Console.WriteLine("Test(int, string)");
}
}
public static void Main()
{
var o1 = Activator.CreateInstance(typeof(Test));
var o2 = Activator.CreateInstance(typeof(Test), 1);
var o3 = Activator.CreateInstance(typeof(Test), 1, "test");
}