c# . net WinForm:在XML中定义处理程序方法名,然后在代码中调用
本文关键字:方法 调用 然后 程序 代码 定义 WinForm net XML 处理 | 更新日期: 2023-09-27 18:05:36
我一直在尝试这样做:
-
问题背景:
- 我正在使用WinForm(不是WPF故意)编码。 我将有一组控件,如:一组组合框,一组按钮,等等,在我的表单。
- 每个控件(尽管是相同的类型,即每个组合框,每个按钮等)的行为将不同于相同的事件。例如:组合框A的selectedIndexChanged将有一个不同的定义,比较组合框B的selectedIndexChanged。
-
我想做什么:
- 我定义了一个XML文件(以下是简化,使其更容易理解):
<EVENTS> <COMBOBOX_A> <SelectedIndexChanged METHOD_NAME="COMBOBOX_A_SelectedIndexChanged"/> </COMBOBOX_A> <COMBOBOX_B> <SelectedIndexChanged METHOD_NAME="COMBOBOX_B_SelectedIndexChanged"/> </COMBOBOX_B> </EVENTS>
- 我可以很容易地解析从这个XML文件中获得方法名。
- 一旦我得到了方法名,那么我想将该方法与相关的事件联系起来。这就是我在下面第4节的问题所在。
-
我这样做的原因
- 我想让它尽可能通用(在某种程度上),这样我就可以在不修改太多代码的情况下,即插即用。例如:只需要修改业务逻辑层(其中有特定的事件处理程序定义),就可以创建通用的控件代码。 现在,我知道,这就是WPF的全部内容,但我有意在WinForm中这样做。
-
最后,我的问题:
- 我一直在研究,这是可能的,通过使用"反射"建议在这个链接:https://msdn.microsoft.com/en-us/library/ms228976(v=vs.110).aspx
- 但是,有没有更简单的方法来实现呢?
(伪代码)
ComboBox A = new ComboBox();
A.SelectedIndexChanged += new System.EventHandlers(xmlNode.Attributes["METHOD_NAME"].Value);
…在代码的其他部分:
public void COMBOBOX_A_SelectedIndexChanged(Object sender, EventArgs e){...}
所以,简而言之,我确实需要学习一种方法,通过传递字符串类型的方法名来连接事件处理程序,其中方法的定义是在业务逻辑层上定义的。
谢谢! !
假设在类中有一个ComboBox的私有方法,如下所示:
private void COMBOBOX_A_SelectedIndexChanged(Object sender, EventArgs e) {...}
让我们从您从xml中获得的名称中获取类' MethodInfo:
var methods = this.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
MethodInfo methodInfo = methods.Single(m => m.Name == xmlNode.Attributes["METHOD_NAME"].Value);
// .Single will throw an exception if there's more than one element found.
// I suppose the value of ["METHOD_NAME"] in your xml is: COMBOBOX_A_SelectedIndexChanged
// Get the handler from the method info
EventHandler handler = (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), this, methodInfo);
// Assign the handler
A.SelectedIndexChanged += handler;