Как узнать, отправлено ли сгенерированное событие его собственным классом? - PullRequest
0 голосов
/ 22 февраля 2011

Есть ли способ узнать, вызвано ли событие в его собственном абоненте. По сути, у меня есть 1.N классы, все по сути одинаковые, каждый из которых выполняется потоком. У меня есть перечисление, которое различает основные типы. У меня есть делегат в классе верхнего уровня, ExecutionState, который создает все подклассы (сохраняет их в коллекции). У меня есть следующее в каждом классе. ExecutionState - класс создателя верхнего уровня, который содержит делегат и соответствующее событие как

    public void Subscribe(ExecutionState ExecState)
    {
        if (this.ExpressionInstance.IsMultiLine)
        {
            ExecState.MultiMatchEvent += new ExecutionState.MultiMatch(Signal);
        }
    }

    private void Signal(int ProcessorPosition)
    { 
    }

    private void SendEvent(ExecutionState.MultiMatch Match)
    {
        if ((Status & RuleState.HasEnd) == RuleState.HasEnd)
        {
            Match(CurrentProcessorNumber);
        }
    }

ExecutionState - это класс создателя верхнего уровня, который содержит делегат и соответствующее событие в виде:

public delegate void MultiMatch(int ProcessorPosition);     
public event MultiMatch MultiMatchEvent;

Когда я вызываю SendEvent, я предполагаю, что событие придет в Сигнал, в своем собственном классе. Конечно, Subscribe необходимо вызывать только тогда, когда существуют определенные условия, которые я настроил в ExecutionState, то есть в 1 классе, который не будет классом отправителя события (по замыслу).

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

Спасибо. Боб.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2011

Если вы посмотрите на сигнатуру класса vanilla EventHandler , первый параметр - object sender.Это типичный шаблон в .NET Framework, и он позволяет сравнивать на предмет равенства с объектом, вызвавшим событие:

public EventHandler(object sender, EventArgs e)
{
   if(this.Equals(sender))
   {
       //...
   }
}

Следуя этой идиоме, разработчики, использующие ваш API, будут хорошо понимать, икак таковой имеет смысл следовать, ИМО.

0 голосов
/ 22 февраля 2011

Если вы посмотрите на события, скажем, ASP.NET, вы обнаружите, что почти все обработчики имеют такую ​​подпись:

public delegate EventHandler(object _sender, EventArgs _args);

Где, конечно, EventArgs - некоторый EventArgs класс, полученный. _sender всегда относится к любому объекту, вызывающему событие.

Вы можете реализовать нечто подобное, либо в подписи делегата, как описано выше, либо в пользовательском EventArgs -эксклюзивном классе, абстрактная база которого может выглядеть примерно так:

public abstract class MyEventArgs
{
    private object m_Sender = null;

    public MyEventArgs(object _sender)
    {
        m_Sender = _sender;
    } // eo ctor

    public object Sender { get { return m_Sender; } }
} // eo class MyEventArgs

Обеспечение, конечно же, того, что все ваши объекты событий проистекают из этого:

public class SomeEventArgs : MyEventArgs { /* ... */ }

Затем вы поднимете свои события следующим образом:

if(OnMyEvent != null)
    OnMyEvent(new SomeEventArgs(this));

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

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