using System.Collections.Generic;
static Dictionary<string, MyDelegate<MyEventArgs<int>>> myDict;
static List<MyInfo> myList;
static Dictionary<string, Action<object, MyEventArgs>> theLastDict;
public static void Main()
Console.WriteLine("Hello World");
Del<int> m1 = new Del<int>(new SomeClass().Notify);
myDict = new Dictionary<string, MyDelegate<MyEventArgs<int>>>();
MyDelegate<MyEventArgs<int>> m2 = new MyDelegate<MyEventArgs<int>>(new SomeClass().SomeMethod);
myList = new List<MyInfo>();
var info = new MyInfo<MyEventArgs<int>>();
info.Name = "SomeMethod";
info.Del = new MyDelegate<MyEventArgs<int>>(new SomeClass().SomeMethod);
var info2 = new MyInfo<MyEventArgs<float>>();
info2.Name = "SomeMethod";
info2.Del = new MyDelegate<MyEventArgs<float>>(new SomeClass().SomeOtherMethod);
var o1 = new SomeOtherClass();
var temp1 = (MyInfo<MyEventArgs<int>>)myList[0];
var temp2 = (MyInfo<MyEventArgs<float>>)myList[1];
temp1.Name = "Hello, World!";
temp1.Del += o1.OnNotifyINT;
temp2.Del += o1.OnNotifyFloat;
var temp3 = (MyInfo<MyEventArgs<int>>)myList[0];
var temp4 = (MyInfo<MyEventArgs<float>>)myList[1];
temp3.Del.Invoke(new SomeClass(), new MyEventArgs<int>(2));
temp4.Del.Invoke(new SomeClass(), new MyEventArgs<float>(2F));
public delegate void Del<T>(T item);
public delegate void MyDelegate<T>(object sender, T e);
public void Notify(int i) { }
public void SomeMethod(object sender, MyEventArgs<int> e){}
public void SomeOtherMethod(object sender, MyEventArgs<float> e){}
public class SomeOtherClass
public void OnNotifyINT(object sender, MyEventArgs<int> e)
Console.WriteLine("Some int has changed!");
public void OnNotifyFloat(object sender, MyEventArgs<float> e)
Console.WriteLine("Some float has changed!");
public abstract class MyEventArgs{}
public class MyEventArgs<T> : MyEventArgs
public MyEventArgs(T theValue)
public abstract class MyInfo{}
public class MyInfo<T> : MyInfo where T : MyEventArgs
public string Name{get; set;}
public MyDelegate<T> Del {get; set;}