Проблема с вызовом простого события

В моем интерфейсе есть событие, у которого нет аргументов

public interface IMyInterface
{
     event EventHandler OnSomethingHappened;
}

Вот как я это реализую.

   public class MyBaseClass : IMyInterface
    {
private event EventHandler onSomethingHappened;
public event EventHandler OnSomethingHappened
{
    add
    {
        onSomethingHappened-= value;
        onSomethingHappened+= value;
    }

    remove
    {
        onSomethingHappened-= value;
    }
}
    }

Но где-то еще, когда я пытаюсь использовать его следующим образом

if ( MyBaseClassInstance.OnSomethingHappened != null )
        MyBaseClassInstance.OnSomethingHappened();

Я получаю следующую ошибку компиляции

Событие «ConsoleApplication1.IMyInterface.OnSomethingHappened» может отображаться только слева от += или -=

Что я делаю неправильно?


person paul deter    schedule 11.02.2015    source источник
comment
MyBaseClass не реализует IMyInterface. Что касается ошибки, найдите ее, например. здесь та же проблема.   -  person Sinatr    schedule 11.02.2015
comment
Спасибо, я пытался это сделать, но продолжаю получать ту же ошибку. Обновлен мой вопрос об изменениях, которые я внес   -  person paul deter    schedule 11.02.2015


Ответы (1)


Вот как может выглядеть ваш код:

    public interface IMyInterface
    {
        event EventHandler OnSomethingHappened;
    }

    //implement the interface
    public class MyBaseClass : IMyInterface
    {
        public event EventHandler OnSomethingHappened;

        public void DoSomeLogicWhichRaisesTheEvent()
        {
            if (OnSomethingHappened != null)
            {
                MyBaseClass sender = this;
                var eventArgs = new EventArgs();
                //let all subscibers to event know that the event happened
                OnSomethingHappened(sender, eventArgs);
            }
        }
    }

    public class ConsumerClass
    {
        private IMyInterface myBaseClassInstance;

        public ConsumerClass()
        {
            myBaseClassInstance = new MyBaseClass();
            //attach to the event
            myBaseClassInstance.OnSomethingHappened += MyBaseClassInstance_OnSomethingHappened;
        }

        private void MyBaseClassInstance_OnSomethingHappened(object sender, EventArgs e)
        {
            //react to the raised event
            throw new NotImplementedException();
        }
    }

Как видите, вам нужно реализовать интерфейс IMyInterface, и когда MyBaseClass нужно вызвать событие, вы вызываете OnSomethingHappened(sender, eventArgs);

ConsumerClass — это то место, где вам нужно потреблять или что-то делать в качестве реакции на инициированное событие. Вы можете переименовать MyBaseClass в какое-либо другое имя без слова «Base», потому что это не абстрактный класс.

person Andrei Lujan    schedule 11.02.2015
comment
Не могли бы вы кратко объяснить, что происходит в этом коде и как это решает проблему? - person anaximander; 11.02.2015