C# Events and Delegates

We use events and delegates to extend applications and to implement loose coupling. Rather than adding various method calls within an implementation and then recompiling the class,
we publish the need to call a set of methods as an event from the class that will invoke those methods (publisher). The publisher will thus define the delegate which will act as the contract/agreement between the publisher and the subscriber (where the specific method is defined) and will define the method signature as it is implemented in the subscriber.
 
There are 5 steps to achieve this:
In Publisher
 
Step 1 – Define the delegate which will act as the contract/agreement between the publisher and the subscriber (where the specific method is defined) and will define the method signature as it is implemented in the subscriber.
 Syntax à  public delegate void NameOfEventHandler(object source, EventArgs e);
    The above delegate will hold a reference to a method that looks like above
Step 2 – Define the event in publisher based on the delegate
Syntax àpublic event NameOfEventHandler MessageEncrypted;
 
Step 3 – Raise / publish event
How to define and call the event handling method –
Call the method à OnMessageEncrypted;
Define the method
 
protected virtual void OnMessageEncrypted(){
              if(MessageEncrypted)
!= null
                           MessageEncrypted(this,
EventArgs.Empty);
}
 
In Subscriber
 
Step 4 – Define the subscriber method whose signature matches that of delegate
public class MailService
    {
        public void OnMessageEncrypted(Object source, EventArgs e)
        {
            Console.WriteLine(“Sending Mail
with encrypted message “
);
        }
    }
Step 5 – Define event handler in calling program and call the method in publisher
static void Main(string[] args)
        {
            var video = new Message {Title = "Confidential"};

            var MessageEncrypter = new MessageEncrypter(); // publisher

            var mailService = new MailService(); //subscriber

            MessageEncrypter.MessageEncrypted += mailService.OnMessageEncrypted;
            MessageEncrypter.Encrypt(message);
        }
If you want to pass in argument values, modify the delegate/event definition and the raise event methods as below –
public event EventHandler<MessageEventArgs> MessageEncrypted;
        public void Encrypt(Message message)
        {
            Console.WriteLine("Encrypting Message");
            Thread.Sleep(3000);
            OnMessageEncrypted(message);
        }

        protected virtual void OnMessageEncrypted(Message message)
        {
            if (MessageEncrypted != null)
                MessageEncrypted(thisnew MessageEventArgs() { Message = message });
        }
Define child class as needed derived from the EventArgs class
public class MessageEventArgs : EventArgs
   {
       public Message Message { getset; }
   }
Modify the subscribers as –
public void OnMessageEncrypted(object source, MessageEventArgs e)
        {
            Console.WriteLine("Sending Text >>>" + e.Message.Title);

 

        }