Is there a way to automatically call a particular method immediately after all constructors have run?

前端 未结 4 1892
独厮守ぢ
独厮守ぢ 2021-02-12 12:54

I want to be able to call a particular method automatically upon construction of a derived object, however I can\'t think how to do it. The following code illustrates. Another a

4条回答
  •  故里飘歌
    2021-02-12 13:25

    While @Jeremy Todd's (accepted) answer works and is a widely accepted solution to the problem, it has a drawback: not very IoC and serialization friendly, since your class cannot be properly constructed using new. Let me introduce a general solution using some C# features. Note that this solution does not require you to use a factory pattern or invoke anything after constructing the object, and it works on any class with just implementing an interface with a single method. First we declare an interface that our classes will have to implement:

    public interface IInitialize {
        void OnInitialize();
    }
    

    Next we add a static extension class for this interface, and add the Initialize method:

    public static class InitializeExtensions
    {
        public static void Initialize(this T obj) where T: IInitialize
        {
            if (obj.GetType() == typeof(T))    
                obj.OnInitialize();
        }
    }
    

    Now, if we need a class and all of its descendants to call an initializer right after the object is fully constructed, all we need to do is implement IInitialize and append a line in the constructor:

    public class Parent : IInitialize
    {
        public virtual void OnInitialize()
        {
            Console.WriteLine("Parent");
        }
    
        public Parent()
        {
            this.Initialize();
        }
    }
    
    public class Child : Parent
    {
        public Child()
        {
            this.Initialize();
        }
    
        public override void OnInitialize()
        {
            Console.WriteLine("Child");
        }
    }
    
    public class GrandChild : Child
    {
        public GrandChild()
        {
            this.Initialize();
        }
    
        public override void OnInitialize()
        {
            Console.WriteLine("GrandChild");
        }
    }
    

    The trick is that when a derived class calls the extension method Initialize, that will suppress any calls not made from the actual class.

提交回复
热议问题