Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Bob.Ответов: 4

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

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

constructorwpfdefinition

Ответы

Ответ 1 · рейтинг 4 · Jon B

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

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

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

Ответ 2 · Joe

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

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

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

Ответ 3 · zahir

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

  • Это потому, что то, что вы делаете в 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, и выполнить проверку режима разработки для метода оболочки.

Ответ 4 · Trisped

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

Public FitsView Init()
{
    //Do stuff

    return this;
}

Потом:

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы