Можно ли вызвать перегруженный конструктор того же класса в 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: " );
}
}
Распакуйте действия конструктора в виртуальные методы и вызовите их оттуда.
Это дает вам полный контроль над порядком, в котором функциональность производного класса выполняется относительно базового класса.