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

3

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

使用下面的示例:应该创建一个ExampleClass实例,并将值发送到BaseClassargument1

class BaseClass
{
    public BaseClass()
    {

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

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

编辑: 我发布了另一个主题来解释我的问题来源: Entity Framework DbContext动态实例化与自定义连接字符串


2
你的问题不是很清楚。 - tnw
让我重新表述一下:需要动态“模拟”一个构造函数,在ExampleClass中覆盖接收“argument1”的BaseClass构造函数。 - Tuk
1
public ExampleClass() : base(String.Empty) {} - valverij
所以你想使用BaseClass的带有argument1参数的构造函数来动态创建ExampleClass的实例?我猜你不能只在ExampleClass中定义缺失的构造函数? - Mecaveli
1
@Tuk 这一切都没有意义,听起来立即像是XY问题,因为你问我们一件事情,但没有说明它的用途和为什么需要这样做。我可以告诉你,极有可能有更好的方法。除非子类为您调用构造函数,否则无法调用该构造函数,如果您想要一个子类引用。 - Adam Houldsworth
显示剩余11条评论
5个回答

2
如果我理解正确,您不能修改ExampleClass,但需要创建一个使用不同基类构造函数的实例?
我认为在框架中没有内置的方法可以实现它,即使使用反射也不行。因此,您的目标应该是绕过框架并使用MSIL。
然而,我在SO上找到了一个有前途的话题。
动态创建类型并调用基类的构造函数

嗨!我看到可能有一种方法。链接的问题让我想到我可以在代码中动态创建我无法创建的“部分”类型,并包含我需要的构造函数。 - Tuk

0

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

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

嗨,詹姆斯,感谢你的回答,请看上面我的答案。 - Tuk

0

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

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

谢谢你的回答,Mike。问题在于,在我的应用程序上下文中,我无法创建缺失的构造函数,因此我认为应该使用反射来解决这个问题。 - Tuk

0

试试这个:

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

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


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

OP说他不能修改ExampleClass或BaseClass。 - Jürgen Steinblock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接