如何将事件传递给方法?
我想创建一个方法,将事件作为参数,并向其添加eventHandler以正确处理它。 像这样:
我有两个事件:
public event EventHandler Click; public event EventHandler Click2;
现在我想将一个特定事件传递给我的方法(伪代码):
public AttachToHandleEvent(EventHandler MyEvent) { MyEvent += Item_Click; } private void Item_Click(object sender, EventArgs e) { MessageBox.Show("lalala"); } ToolStripMenuItem tool = new ToolStripMenuItem(); AttachToHandleEvent(tool.Click);
可能吗?
我注意到这段代码工作正常,并返回到我的项目,并注意到当我传递在我的类中声明的事件时,它可以工作,但是当我从其他类传递事件时,它仍然无效。
我得到的是这个错误:
事件’System.Windows.Forms.ToolStripItem.Click’只能出现在+ =或 – =的左侧
我的原始答案适合于定义该事件的类中,但您已经更新了您的问题,以反映您希望从定义类之外完成此操作,所以我已经打败了它。
只有定义事件的类才能引用事件使用的隐式委托变量。 从该类外部,您只能通过+=
和-=
访问add
和remove
方法。 这意味着你不能直接做你所要求的。 但是,您可以使用function方法。
class A{ public event EventHandler Event1; public void TriggerEvent1(){ if(Event1 != null) Event1(this, EventArgs.Empty); } } class B{ static void HandleEvent(object o, EventArgs e){ Console.WriteLine("Woo-hoo!"); } static void AttachToEvent(Action attach){ attach(HandleEvent); } static void Main(){ A a = new A(); AttachToEvent(handler=>a.Event1 += handler); a.TriggerEvent1(); } }
我是这样做的:
public AttachToHandleEvent(Object obj, string EventName) { EventInfo mfi = obj.GetType().GetEvent(EventName); MethodInfo mobj = mfi.GetAddMethod(); mobj.Invoke(obj, new object[] { Item_Click}); } private void Item_Click(object sender, EventArgs e) { MessageBox.Show("lalala"); } ToolStripMenuItem tool = new ToolStripMenuItem(); AttachToHandleEvent(tool "Click");
谢谢大家的建议。 没有你的帮助,这个解决方案是无法完成的。
这是不可能的。 如果满足您的需求,您可以使用代理而不是事件。
只需编写工具。 tool.Click += Item_Click;
编辑:从MSDN“事件只能从声明它们(它)的类或结构中调用”。 所以你要做的就是不可能。 你能详细说明你的需求吗? 为什么要将事件作为参数传递?
delegate void doIt(object sender, object data); event doIt OnDoIt; void add(doIt theDel) { OnDoIt += theDel; } void doIt1(object a, object b) { } void doIt2(object a, object b) { } void add() { add(doIt1); add(doIt2); }
你的问题表明你有一些错误的机制:你无法传递事件!
您最有可能希望将函数作为参数传递,因此调用方法将在某个时刻调用该其他方法。 在技术方面,这是一个代表。 我建议使用已定义的Action类。 这是一个示例代码段:
void MyFunction (string otherArguments, Action onFinished){ ... if (onFinished != null) onFinished.Invoke(); }
关于这一点的好处是,当调用MyFunction时,您可以使用内联语法声明Action:
上述就是C#学习教程:如何将事件传递给方法?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
MyFunction("my other argument", ()=>{ ///do stuff here, which will be execuded when the action is invoked });
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/999637.html