c# . net WinForm:在XML中定义处理程序方法名,然后在代码中调用

本文关键字:方法 调用 然后 程序 代码 定义 WinForm net XML 处理 | 更新日期: 2023-09-27 18:05:36

我一直在尝试这样做:

  1. 问题背景:

    • 我正在使用WinForm(不是WPF故意)编码。
    • 我将有一组控件,如:一组组合框,一组按钮,等等,在我的表单。
  2. 每个控件(尽管是相同的类型,即每个组合框,每个按钮等)的行为将不同于相同的事件。例如:组合框A的selectedIndexChanged将有一个不同的定义,比较组合框B的selectedIndexChanged。
  3. 我想做什么:

    • 我定义了一个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节的问题所在。
  4. 我这样做的原因

    • 我想让它尽可能通用(在某种程度上),这样我就可以在不修改太多代码的情况下,即插即用。例如:只需要修改业务逻辑层(其中有特定的事件处理程序定义),就可以创建通用的控件代码。
    • 现在,我知道,这就是WPF的全部内容,但我有意在WinForm中这样做。
  5. 最后,我的问题:

    • 我一直在研究,这是可能的,通过使用"反射"建议在这个链接: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){...}

所以,简而言之,我确实需要学习一种方法,通过传递字符串类型的方法名来连接事件处理程序,其中方法的定义是在业务逻辑层上定义的。

谢谢! !

c# . net WinForm:在XML中定义处理程序方法名,然后在代码中调用

假设在类中有一个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;