使用基构造函数创建实例

本文关键字:创建 实例 构造函数 | 更新日期: 2023-09-27 18:11:54

由于超出问题范围的原因,我需要动态创建继承自基类的子类的实例,调用不存在的构造函数并将参数传递给基类构造函数

使用下面的示例:应该创建一个ExampleClassBaseClassargument1发送值的实例。

class BaseClass
{
    public BaseClass()
    {
    }
    public BaseClass(string argument1)
    {
        //...
    }
}
class ExampleClass : BaseClass
{
    public ExampleClass()
    {
    }
}

EDIT:我做了另一个主题,我解释了来源或我的问题:使用自定义连接字符串

使用基构造函数创建实例

动态安装实体框架DbContext

如果我理解正确,你不能修改ExampleClass,但需要创建一个使用不同构造函数的基类的实例?

我相信在框架中没有办法实现它,即使有反射。因此,您的目标应该是绕过框架并使用MSIL

然而,我在SO上发现的这个话题看起来很有希望。

动态创建类型并调用基类的构造函数

要调用基类的构造函数吗?

public ChildClass(string arg1) : base(arg1)
{
    //above will invoke base constructor that takes a string argument
}

我能看到的唯一方法是添加一个ParentClass构造函数。我不需要做任何事情,所以我不明白为什么你不能添加它:

public ParentClass(string argument1) : BaseClass(argument1)
{
}

试试这个:

class ExampleClass : BaseClass
{
    public ExampleClass()
        : base(Properties.Settings.Default.MyArgument)
    {
    }
}

您可以使用Properties.Settings.Default.MyArgument来传递您想要在基类构造函数中使用的参数值,而无需修改每次需要更改参数值的源代码(只需将其添加到项目的设置,应用程序范围)。

如果你不能给ChildClass添加一个非默认构造函数,那么你就不能创建一个调用基类构造函数的ChildClass实例。构造函数不能被继承。然后需要重构基类,以便有办法不使用构造函数来设置参数。例如:

class BaseClass
{
    public BaseClass()
    {
    }
    public BaseClass(string argument1)
    {
         Init(argument1);
    }
    public void Init(string argument1)
    {
        //...
    }
}
class ExampleClass : BaseClass
{
    public ExampleClass()
    {
    }
}

然后你可以创建一个ExampleClass的实例,并调用Init方法来初始化它:

 ExampleClass e = (ExampleClass)Activator.CreateInstance.... // or whatever
 e.Init(arugment);