运行时确定的类型的非默认构造函数



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

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

也就是说,我有BaseClass和各种儿童班。

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

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

三个选项:

  • 先使用Type.GetConstructor,然后使用ConstructorInfo.Invoke
  • 使用Activator.CreateInstance的重载之一,该重载接受参数
  • 如果您事先已经知道所有可能的类型,请创建一个Dictionary<Type, Func<string, string, YourBaseType>>或任何合适的类型

当然,第三个选项要求每次添加新类型时都更改工厂代码,但这只是一行代码。

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

您可以使用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");
}

相关内容

  • 没有找到相关文章

最新更新