【问题标题】:Create Instance using base constructor使用基本构造函数创建实例
【发布时间】:2013-05-02 23:29:35
【问题描述】:

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

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

class BaseClass
{
    public BaseClass()
    {

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

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

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

【问题讨论】:

  • 你的问题不是很清楚。
  • 你能描述一下为什么你不能简单地做public ExampleClass(string s) : base(s){}吗?
  • public ExampleClass() : base("someValue") {} ----?
  • public ExampleClass() : base(String.Empty) {}
  • @Tuk 这一切都毫无意义,听起来就像XY Problem,因为你问我们一件事,但没有说明它的用途以及为什么需要这样做。我现在可以告诉你,极有可能有更好的方法。如果您想要一个子引用,除非孩子为您调用它,否则无法调用该构造函数。

标签: c# reflection constructor


【解决方案1】:

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

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

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

Dynamically create type and call constructor of base-class

【讨论】:

  • 嗨!我看可能有办法。链接的问题让我觉得我可以动态地创建我无法在代码上创建的“部分”类型并包含我需要的构造函数。
【解决方案2】:

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

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

【讨论】:

  • 嗨,詹姆斯,谢谢 4 您的回答,请在上面查看我的回答
【解决方案3】:

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

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

【讨论】:

  • 谢谢 4 你的回答 Mike,问题是在我的应用程序的上下文中我无法创建缺少的构造函数,所以我认为应该使用反射解决方法
【解决方案4】:

试试这个:

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

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

【讨论】:

    【解决方案5】:

    如果你不能为你的 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
    猜你喜欢
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2011-08-30
    • 2020-12-21
    相关资源
    最近更新 更多