由于问题范围之外的原因,我需要动态创建一个继承自基类的子类的实例,调用一个不存在的构造函数,并将参数传递给基类构造函数
使用以下示例:应创建ExampleClass
的实例,将argument1
的{{1}}发送给BaseClass
。
class BaseClass
{
public BaseClass()
{
}
public BaseClass(string argument1)
{
//...
}
}
class ExampleClass : BaseClass
{
public ExampleClass()
{
}
}
编辑:我做了另一个话题,我解释了来源或问题: Entity Framework DbContext dynamic instatiation with custom Connection String
答案 0 :(得分:2)
如果我理解它是正确的,你不能修改ExampleClass但是需要创建一个使用不同构造函数的基类实例吗?
我相信,即使有了反思,也不会在框架中建立起来实现它。 所以你的目标应该是绕过框架并使用MSIL
然而,我在SO上找到的这个主题看起来很有希望。
答案 1 :(得分:0)
你想调用基类的构造函数吗?
public ChildClass(string arg1) : base(arg1)
{
//above will invoke base constructor that takes a string argument
}
答案 2 :(得分:0)
我能看到这样做的唯一方法是添加一个ParentClass构造函数。我不需要做任何事情,所以我不明白为什么你不能添加它:
public ParentClass(string argument1) : BaseClass(argument1)
{
}
答案 3 :(得分:0)
试试这个:
class ExampleClass : BaseClass
{
public ExampleClass()
: base(Properties.Settings.Default.MyArgument)
{
}
}
您可以使用Properties.Settings.Default.MyArgument
来传递要在基类构造函数中使用的参数的值,而无需在每次需要更改参数值时修改源代码(只需将其添加到项目的< em>设置,应用范围)。
答案 4 :(得分:-1)
如果无法向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);