3

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

使用下面的示例:应该创建一个向 ofExampleClass发送值argument1的实例BaseClass

class BaseClass
{
    public BaseClass()
    {

    }
    public BaseClass(string argument1)
    {
        //...
    }
}

class ExampleClass : BaseClass
{
    public ExampleClass()
    {
    }
}

编辑:我提出了另一个主题来解释源或我的问题: Entity Framework DbContext dynamic instatiation with custom Connection String

4

5 回答 5

2

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

我相信在框架中没有建立实现它的方法,即使有反射。所以你的目标应该是绕过框架并使用 MSIL

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

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

于 2013-05-02T14:34:22.803 回答
0

你想调用基类的构造函数吗?

public ChildClass(string arg1) : base(arg1)
{
    //above will invoke base constructor that takes a string argument
}
于 2013-05-02T14:18:50.170 回答
0

尝试这个:

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

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

于 2013-05-02T14:25:48.087 回答
0

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

public ParentClass(string argument1) : BaseClass(argument1)
{
}
于 2013-05-02T14:21:01.547 回答
-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);
于 2013-05-02T14:35:54.000 回答