使用基础构造函数创建实例

时间:2013-05-02 14:15:02

标签: c# reflection constructor

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

使用以下示例:应创建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

5 个答案:

答案 0 :(得分:2)

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

我相信,即使有了反思,也不会在框架中建立起来实现它。 所以你的目标应该是绕过框架并使用MSIL

然而,我在SO上找到的这个主题看起来很有希望。

Dynamically create type and call constructor of base-class

答案 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);