Created
September 7, 2009 09:14
-
-
Save JeffreyZhao/182244 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static class EventFactory | |
{ | |
public static Event<T> Create<T>(Expression<Func<T>> eventExpr) | |
{ | |
return new Event<T>(eventExpr); | |
} | |
} | |
public class Event<T> | |
{ | |
public Event(Expression<Func<T>> eventExpr) | |
{ | |
var memberExpr = eventExpr.Body as MemberExpression; | |
this.m_instance = memberExpr.Expression == null ? null : | |
Expression.Lambda<Func<object>>(memberExpr.Expression).Compile()(); | |
var bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod | | |
(this.m_instance == null ? BindingFlags.Static : BindingFlags.Instance); | |
var member = memberExpr.Member; | |
this.m_addMethod = member.DeclaringType.GetMethod("add_" + member.Name, bindingFlags); | |
this.m_removeMethod = member.DeclaringType.GetMethod("remove_" + member.Name, bindingFlags); | |
} | |
private object m_instance; | |
private MethodInfo m_addMethod; | |
private MethodInfo m_removeMethod; | |
public Event<T> AddHandler(T handler) | |
{ | |
this.m_addMethod.Invoke(this.m_instance, new object[] { handler }); | |
return this; | |
} | |
public Event<T> RemoveHandler(T handler) | |
{ | |
this.m_removeMethod.Invoke(this.m_instance, new object[] { handler }); | |
return this; | |
} | |
public static Event<T> operator +(Event<T> ev, T handler) | |
{ | |
return ev.AddHandler(handler); | |
} | |
public static Event<T> operator -(Event<T> ev, T handler) | |
{ | |
return ev.RemoveHandler(handler); | |
} | |
} | |
class Program | |
{ | |
public event EventHandler Submit; | |
static void Main(string[] args) | |
{ | |
Program p = new Program(); | |
var ev = EventFactory.Create(() => p.Submit); | |
ev += (sender, eventArgs) => Console.WriteLine(sender); | |
p.Submit("Hello World", EventArgs.Empty); | |
Console.WriteLine("Press any key to exit..."); | |
Console.ReadLine(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment