Можно ли вызвать перегруженный конструктор того же класса в C#?

Я знаю, что могу сделать это с помощью ': this()', но если я это сделаю, перегруженный конструктор будет сначала освобожден, и мне нужно, чтобы он выполнялся после того конструктора, который его вызовет.,,, Сложно объяснить, позвольте мне положить код:

Class foo{
    public foo(){
       Console.WriteLine("A");
    }
    public foo(string x) : this(){
       Console.WriteLine(x);
    }
}

///....

Class main{
    public static void main( string [] args ){
       foo f = new foo("the letter is: ");
    }
}

В этом примере программа покажет

A 
the letter is:

но я хочу

the letter is: 
A

Есть "элегантный способ" сделать это? Я бы предпочел не извлекать действия конструктора в отдельный метод и вызывать их оттуда.

2 ответа

Решение

Да, вы можете сделать это довольно легко (к сожалению):

class foo {
    public foo( ) {
        Console.WriteLine( "A" );
    }
    public foo( string x ) {
        Console.WriteLine( x );

        var c = this.GetType( ).GetConstructor( new Type[ ] { } );
        c.Invoke( new object[ ] { } );
    }
}

class Program {
    static void Main( string[ ] args ) {
        new foo( "the letter is: " );
    }
}

Распакуйте действия конструктора в виртуальные методы и вызовите их оттуда.

Это дает вам полный контроль над порядком, в котором функциональность производного класса выполняется относительно базового класса.

Другие вопросы по тегам