0

可能重复:
Activator.CreateInstance - 如何创建具有参数化构造函数的类的实例

我想知道如何在不使用默认构造函数的情况下创建在运行时确定的类型的对象。

也就是说,我有BaseClass各种子类。

Type type; //this variable will be one of the child classes
BaseClass base = Activator.CreateInstance(type);

这允许我使用默认构造函数创建一个子类对象,但我想调用一个特定的构造函数。我知道所有的子类都有一个带有某些参数的构造函数,所以我不担心那个构造函数不存在。我发现了这个问题,但我能得到的最好的结果是一个字符串参数。这是可行的吗?

4

2 回答 2

3

三个选项:

当然,第三个选项要求您在每次添加新类型时更改工厂代码 - 但它只有一行。

我个人喜欢第一个选项,因为它为您提供了最大的控制权(而不是依赖于Activator.CreateInstance在执行时找到最佳匹配的构造函数) - 如果这是对性能敏感的代码,您可以在执行时通过发现来构建委托字典构造函数,然后使用表达式树。(据我所知,您不能使用构造函数构建委托Delegate.CreateDelegate,这有点烦人。)

于 2013-01-02T19:11:03.917 回答
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");
}
于 2013-01-02T19:08:30.590 回答