2015-12-23 2 views
0

У меня есть класс журнала, с которого я хочу инициировать события. Событие расположено в моем базовом классе. Пока я звоню из базового класса, он работает нормально. Моя проблема заключается в "внешних" называет:Триггерные события из внешнего класса

Мой базовый класс:

public delegate void StatusUpdateHandler(object sender, object arg); 

public interface IFoo 
{ 
    event StatusUpdateHandler OnStatusChanged; 
} 

public class Foo : IFoo 
{ 
    public event StatusUpdateHandler OnStatusChanged; 
} 

Мой метод класса журнала (в другом классе):

public void Log(string logMessage, StatusUpdateHandler updateHandler) 
{ 
    logEntries.Add(logMessage); 

    if (updateHandler == null) 
     return; 
    updateHandler(this, logMessage); 
} 

Вызов метод из Foo работает отлично :

loggerInstance.Log("test", OnLogMessage); 

Но когда я делаю вызов из-за пределов класса я получаю эту ошибку компиляции:

void OutsideFooLog(IFoo foo) 
{ 
    loggerInstance.Log("test", foo.OnLogMessage) 
} 

// The event 'OnLogMessage' can only appear on the left hand side of += or -= 

Моя цель здесь, чтобы вызвать OnLogMessage в Foo всякий раз, когда я делаю запись в журнале, независимо от того, я вхожу внутри или вне самого класса. Причина, по которой я хочу это как параметр, состоит в том, что у меня есть несколько других событий.

+0

Вы не можете получить доступ к событиям из других классов. Вам придется обернуть их методами, которые поднимут события, и использовать методы в качестве аргумента или что-то подобное (например, использовать enum и событие пожара из инструкции 'switch') –

ответ

1

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

Вы должны думать о проблемах своих классов. Событие OnLogMessage должно быть поднято классом, задачей которого является обработка сообщений журнала. Если вы будете следовать этому правилу, вам больше никогда не приходите в эту ситуацию.

Также особенно в примерах кода, пожалуйста, назовите ваши типы и элементы что-то значимое. Мне было очень трудно понять мотивацию и ответственность за вашим примером кода (Foo).

+0

Да, я думал о разделении проблем после публикации этого , Спасибо, что подняли его – filur