Don't most (all?) events in .NET follow the EventHandler/EventArgs pattern:
public class StatementEventArgs : EventArgs { public IMappedStatement MappedStatement; public StatementEventType Type; public object ParameterObject; public object Result; } public interface IMappedStatementEvents { event EventHandler<StatementEventArgs> PreInsert; event EventHandler<StatementEventArgs> PreSelect; event EventHandler<StatementEventArgs> PreUpdateOrDelete; event EventHandler<StatementEventArgs> PostInsert; event EventHandler<StatementEventArgs> PostSelect; event EventHandler<StatementEventArgs> PostUpdateOrDelete; } // Castle.MicroKernel.KernelEventSupport public class MappedStatementEventSupport : IMappedStatementEvents { private static readonly object PreInsertEvent = new object(); // snip private EventHandlerList events = new EventHandlerList(); public event EventHandler<StatementEventArgs> PreInsert { add { events.AddHandler(PreInsertEvent, value); } remove { events.RemoveHandler(PreInsertEvent, value); } } protected virtual object RaisePreInsert(IMappedStatement mappedStatement, object parameterObject) { EventHandler<StatementEventArgs> handler = (EventHandler<StatementEventArgs>) events[PreInsertEvent]; // TODO: create StatementEventArgs and Invoke each item in handler.GetInvocationList() } // snip } public class MappedStatement : MappedStatementEventSupport, IMappedStatement { // add calls to raise events: RaisePreInsert(mappedStatement, parameterObject); } Is there a reason why we rolled our own? I like this: mappedStatement.PreInsert += (s, e) => { Console.WriteLine(e.MappedStatement.Id); } This seems like a lot of code just to register MyConsoleWriter: // ??? PreInsetEventListener[] preInsertEvents = new PreInsetEventListener[mappedStatement.PreInsertListeners.Length + 1]; mappedStatement.PreInsetEventListener.CopyTo(preInsertEvents, 0); preInsertEvents.SetValue( new MyConsoleWriter(), mappedStatement.PreInsetEventListener.Length); mappedStatement.PreInsetEventListener = preInsertEvents; Maybe the listeners should be exposed as System.Collection.Generic.ICollection<T>: mappedStatement.PreInsetEventListener.Add(new MyConsoleWriter()); Also note that I had to write my own class, MyConsoleWriter, instead of just the short lambda expression. The standard EventHandler/EventArgs model makes the most sense to me. ----- Original Message ---- From: "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> To: [EMAIL PROTECTED] Sent: Sunday, June 8, 2008 2:20:46 PM Subject: svn commit: r664536 [1/4] - in /ibatis/trunk/cs/V3/src: Apache.Ibatis.DataMapper.SqlClient.Test.2005/ Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/ Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Mapping/ Apache.Ibatis.DataMapper.SqlClie... Author: gbayon Date: Sun Jun 8 11:20:44 2008 New Revision: 664536 URL: http://svn.apache.org/viewvc?rev=664536&view=rev Log: IBATISNET-271 add event support Added: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Mapping/EventTest.cs (with props) ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Modules/EventModule.cs (with props) ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/ScriptBase.cs (with props) ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Maps/Event.xml ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/bin/Debug/SqlMap.event.config ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/DataMapperLocalSessionScope.cs (with props) ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Events/ [snip]