使用基构造函数创建实例
本文关键字:创建 实例 构造函数 | 更新日期: 2023-09-27 18:11:54
由于超出问题范围的原因,我需要动态创建继承自基类的子类的实例,调用不存在的构造函数并将参数传递给基类构造函数
使用下面的示例:应该创建一个ExampleClass
向BaseClass
的argument1
发送值的实例。
class BaseClass
{
public BaseClass()
{
}
public BaseClass(string argument1)
{
//...
}
}
class ExampleClass : BaseClass
{
public ExampleClass()
{
}
}
EDIT:我做了另一个主题,我解释了来源或我的问题:使用自定义连接字符串
如果我理解正确,你不能修改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);