65.9K
CodeProject is changing. Read more.
Home

Referencing events in C# using interfaces - A simple approach

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0 vote)

Sep 6, 2012

CPOL

1 min read

viewsIcon

21257

Passing event references as interfaces in C# by proxifying them within "EventReference" instances.

Introduction

The following article shows a simple method to "reference" events using interfaces and generics. For the sake of simplicity, it uses Actions and Functions.

Background 

The only closely related article I could find is the following:

Source Code Overview

A non-generic event reference description:

public interface IEventReference { }

can be used to constrain the more concrete, but nevertheless generic event description interfaces.

public interface IActionEventReference<I> where I : IEventReference
{
    event Action Event;
}
public interface IActionEventReference<I, P1> where I : IEventReference
{
    event Action<P1> Event;
}

public interface IFuncEventReference<I, R> where I : IEventReference
{
    event Func<R> Event;
}
public interface IFuncEventReference<I, P1, R> where I : IEventReference
{
    event Func<P1, R> Event;
}

Using the Code  

Consider having a class which exposes some events, for example:

public class ClassExposingEvents
{
  public event Func<bool> BeforeCancel;
}

Adding the possibility to "reference" the BeforeCancel-event can be done in three steps:

First, an interface for the concrete event reference can be created: 

public interface IBeforeCancelEventReference : IEventReference { event Func<bool> BeforeCancel; }

and added to the class which provides the event:

pulic class ClassExposingEvents : IBeforeCancelEventReference
{
  public event Func<bool> BeforeCancel;
}

Second, a proxy class for the event can be defined (I usually do it as a subclass of the event container but this is not necessary):

public class BeforeCancelEventRef : 
         IFuncEventReference<IBeforeCancelEventReference, bool>
{
  IBeforeCancelEventReference e;
  public BeforeCancelEventRef(IBeforeCancelEventReference eventContainer) { e = eventContainer; }
  public event Func<bool> Event
  {
    add { e.BeforeCancel += value; }
    remove { e.BeforeCancel -= value; }
  }
}

Finally, all which need a reference to the BeforeCancel-event just need an instance of the class BeforeCancelEventRef (usually given back as an interface and created by a factory or something else which is appropriate).

To use the reference, we then can just add and remove targets from the Event-property of the reference class:

IFuncEventReference<IBeforeCancelEventReference, bool> bce = ...;
bce.Event += ...;

Points of Interest  

Exceptions and performance are not covered by the article.  

History 

  • 2012/09/06: First version submitted.