Могу ли я передать метод Invoke из формы другому классу? - PullRequest
0 голосов
/ 08 ноября 2019

Немного сбивает с толку архитектурную проблему.

У меня есть форма с именем MyForm, и в ней есть текстовое поле, в которое я хочу войти. Есть метод Output(string, LogType), который делает это. LogType - это перечисление.

У меня есть класс Manager, который при создании порождает поток. Я хочу, чтобы этот поток добавлялся в текстовое поле.

Я хочу сделать это наиболее абстрактно, насколько это возможно.

В идеале это должно включать передачу ссылки на метод Invoke вс делегатом, указывающим на мой метод Log(string), такой, что классу Manager просто передается объект, и он может выполнять object("hello")

Однако я не совсем уверен, возможно ли это. Я был привязан к делегатам, лямбдам и действиям, пытаясь понять это.

Это было бы элегантно, поскольку мне не нужно было бы добавлять какие-либо дополнительные методы к моей форме, писать оболочку журнала или что-то еще. Возможно ли это?

Эдито: Я придумал это, я мог бы быть близко:

new Action<string, LogType>((s,l) => Invoke(new Action<string, LogType>((t,m) => Output(t,m))));

тогда мне нужно передать s, l вт, м

new Action<string, LogType>((s,l) => Invoke(new Action<string, LogType>((t,m) => Output(t,m))(s,l)));

, а затем все идет не так

Кажется, немного затянуто, хотя ...

1 Ответ

0 голосов
/ 08 ноября 2019

Если ваш класс MyForm создает объект Manager, вы можете передать конструктору Manager делегат, который позволит ему использовать метод Output:

MyForm.cs

Manager m = new Manager(Output);

private void Output(string s, LogType t) { }

и в вашем Manager классе:

Manager.cs

private Action<string, LogType> _logAction;

public Manager(Action<string, LogType> logAction) { 
    _logAction = logAction;
}

private void DoStuff() {
    logAction("My log message", LogType.Info);
}

Обратите внимание, что вымогут возникнуть проблемы из-за того, что объекты пользовательского интерфейса не могут быть изменены извне из потока пользовательского интерфейса.

Существуют более эффективные способы обработки входа в пользовательский интерфейс, например MyForm подписка на событие Manager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...