Skip to content

Instantly share code, notes, and snippets.

@jonfuller
Created September 2, 2009 14:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jonfuller/179735 to your computer and use it in GitHub Desktop.
Save jonfuller/179735 to your computer and use it in GitHub Desktop.
public class EventTracker<TDelegate>
where TDelegate : class
{
public static implicit operator TDelegate( EventTracker<TDelegate> tracker )
{
return tracker.Delegate;
}
public EventTracker()
{
var delegateMeta = typeof( TDelegate ).GetMethod( "Invoke" );
var delegateParams = delegateMeta
.GetParameters()
.Map( param => param.ParameterType )
.Prepend( GetType() )
.ToArray<Type>();
var invokedMethod = GetType().GetMethod( "Invoked", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public );
var dynamicHandler = new DynamicMethod( "", delegateMeta.ReturnType, delegateParams, GetType(), true );
var generator = dynamicHandler.GetILGenerator();
generator.Emit( OpCodes.Ldarg_0 );
generator.Emit( OpCodes.Call, invokedMethod );
generator.Emit( OpCodes.Ret );
Delegate = dynamicHandler.CreateDelegate( typeof( TDelegate ), this ) as TDelegate;
}
public TDelegate Delegate
{
get;
private set;
}
public int CallCount
{
get;
private set;
}
public bool WasCalled
{
get { return CallCount > 0; }
}
public bool WasNotCalled
{
get { return !WasCalled; }
}
// called via the dynamic method
private void Invoked()
{
CallCount++;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment