C# 施工后自动初始化

C# 施工后自动初始化,c#,reflection,C#,Reflection,virtual方法不应该在基类的构造函数中调用,因为派生类的构造函数没有被调用,所以所有初始化逻辑都没有被调用 我想知道是否有一种方法可以在对象完全构造后自动调用方法。 我不想把调用初始化方法的责任推给用户 假设我有以下几点 public abstract class Foo { protected Foo() { ... AfterConstruction(); } protected virtual void AfterConstruction(){} }

virtual
方法不应该在基类的构造函数中调用,因为派生类的构造函数没有被调用,所以所有初始化逻辑都没有被调用

我想知道是否有一种方法可以在对象完全构造后自动调用方法。 我不想把调用初始化方法的责任推给用户

假设我有以下几点

public abstract class Foo
{
  protected Foo()
  {
    ...
    AfterConstruction();
  }

  protected virtual void AfterConstruction(){}
}

public class Bar : Foo
{
  protected override void AfterConstruction()
  {
    ...
  }
}
我知道不应该这样做,我想也许可以通过使用反射来观察对象构造,然后在构造完成后挂起调用函数
AfterConstruction()
,来解决这个问题。 但是我找不到合适的代码来这样做


感谢您的想法

如果我遗漏了一些重要的细节,请告诉我,但您有多种选择,这取决于您的类被认为是完全初始化的时间。 此外,“在构造函数之后”与构造函数中的最后一行相同(通常是无论如何),在您的逻辑中是否有任何东西与此相矛盾

如果可以在所创建的类内实现完整类初始化: 1.在构造函数末尾或初始化类的任何地方调用它。 2.在基类构造函数之后的子类中调用它。这将确保基类已初始化

如果您无法在自己的类中实现完整的类初始化,换句话说,如果您的类仅在用户初始化某些参数后才被视为初始化,那么您别无选择,只能将至少1个方法调用留给子类的创建者

基类的默认构造函数将在子类构造函数之前调用: 要测试的简单代码:

class Program
 {
     static void Main(string[] args)
     {
         new Bar();
     }
 }


class Foo
{
    public Foo()
    {
        MessageBox.Show("Foo");
    }
}

class Bar : Foo
{
    public Bar()
    {
        MessageBox.Show("Bar");
    }
}
输出:

信息框:“Foo”

信息框:“酒吧”


实际上,我想重要的部分是,用户可能实现也可能不实现派生类的构造函数,可能实现也可能不实现
AfterConstruction()
方法。但是我仍然需要调用这个方法。这是因为它类似于一个契约,它保证继承人在
AfterConstruction()
方法中实现的任何东西都将在构造后被调用。要解释为什么我需要这个方法,我就不谈了,但如果有必要,我可以更新这个问题。如果我没记错的话,在创建子类时总是执行默认构造函数(没有参数)。我马上测试。是的,将调用默认构造函数,因此您可能希望使用默认构造函数。我知道,但问题在于,当调用基类的构造函数时,对象仍然不是派生类型,仍然
Foo
(尚未调用派生构造函数)因此,当我在基类构造函数中调用类型为
Bar
的虚方法时,当您使用
Bar
-成员等时,它们不会被初始化,因为正如我所说的,
Bar
-构造函数还没有被调用,所有的
Bar
-状态信息都被忽略了,所以我知道它在继承的情况下是如何工作的:基本构造函数->特殊构造函数->更特殊的构造函数,但方法是相反的:最特殊->。。