Можете ли вы вызвать метод класса при объявлении объекта?

У меня есть класс, в котором я его объявляю, но этот класс добавляется как элемент к другому большему классу. Есть ли способ вызвать метод Init() в том же операторе, что и вызов? Аналогично определению общедоступных свойств / переменных при вызове конструктора. Я не хочу вызывать метод Init() в конструкторе, потому что он мешает конструктору WPF.

 FitsView fv = new FitsView();
 fv.Init();

person Bob.    schedule 05.12.2012    source источник


Ответы (4)


Для этого вы можете использовать статическую функцию:

public static FitsView CreateFitsView()
{
    var fv = new FitsView();
    fv.Init();
    return fv;
}

Затем вы просто вызываете эту статическую функцию вместо new FitsView()

person Jon B    schedule 05.12.2012

Вы также можете попробовать подключить настраиваемое событие к своему FitsView, если он знает, когда он готов к инициализации?

И используйте это так:

FitsView fv = new FitsView();
fv.someCustomEvent += (o,e) => { fv.Init(); };
person Joe    schedule 05.12.2012

Если у дизайнера возникают проблемы из-за вашего метода инициализации, я могу подумать по двум причинам:

  • Это потому, что то, что вы делаете в Init методе, требует локализации вашего приложения (чтение ресурсов или файлов или использование оборудования)
  • Вызов вашего метода Init требует динамической загрузки некоторых внешних сборок.

В первую очередь вы можете проверить:

  1. Для вашего класса: Есть ли в WPF свойство DesignMode?
  2. Для вашей модели представления: http://blog.laranjee.com/how-to-get-design-mode-property-in-wpf/

Также люди здесь указали на эту ошибку, поэтому будьте осторожны (хостинг wpf в winforms): https://connect.microsoft.com/VisualStudio/feedback/details/620001/system-componentmodel-designerproperties-getisindesignmode-does-not-work-if-the-wpf-is-hosted-on-a-winform#tabs

Во втором случае вы можете обернуть свой Init метод другим, скажем InitWrapper, и выполнить проверку режима разработки для метода оболочки.

person zahir    schedule 05.12.2012

Подобно StringBuilder.Append, вы можете изменить Init на вернуть ссылку на объект.

Public FitsView Init()
{
    //Do stuff

    return this;
}

Потом:

FitsView fv = new FitsView().Init();
person Trisped    schedule 05.12.2012