c# - Omit sender of delegates -
is possible send reference of 'sender' without specifying explicitly parameter in delegate-based event handling?
i have internal class raises events , want call events explicitly test purposes.
public class manager { public class datastruct { public int id { get; private set; } public event eventhandler event1; // can't called other classes public void fireevent1(event1();} // caller... // delegates *can* called other classes public delegate void delegatehandler(datastruct sender); public delegatehandler newevent; public void delegatehandler(datastruct sender) { messagebox.show(string.format( "{0} raises event", sender.id)); } } } // form1 /////////////////////////////////////////////////////////////////// partial class form1 { manager.datastruct dsraiser, dslistener; private void form1_load(object sender, eventargs e) { dsraiser.event1 += dslistener.some_handler; dsraiser.newevent += dslistener.delegatehandler; } private void button1_click(object sender, ...) { dsraiser.fireevent1(); // no argument needed fireevent1, not event1(). } private void button2_click(object sender, ...) { dsraiser.newevent(dsraiser); // way omit parameter dsraiser? } //////////////////////////////////////////////////////////////////////////
if handler method needs use sender's reference, have pass reference. if not, declare void parameterless delegate, action.
but when thinking of events, parameter should passed class raises event itself. (remember events not meant called outside).
so, if want use simple delegate instead of event, have pass parameters. if need sender, need did event: create method "raise" delegate, , in method pass this sender.
but considering have same thing in both cases, i'd surely use event.
public class datastruct { public int id { get; private set; } public event eventhandler event1; // can't called other classes // need pass parameters event when called. public void fireevent1{event1(this, new eventargs());} // delegates *can* called other classes, parameters passed. public delegate void delegatehandler(datastruct sender); public delegatehandler newevent; // avoid passing parameters, need did event public void raisedelegate() { newevent(this); } public void delegatehandler(datastruct sender) { messagebox.show(string.format( "{0} raises event", sender.id)); } }
Comments
Post a Comment