C# 从xml文件调用方法

C# 从xml文件调用方法,c#,reflection,C#,Reflection,我有一个xml文件,名为Methods.xml,如下所示 .... <Method> <MethodName>foo</MethodName> <MethodParams>fooString1, fooString2</MethodParams> </Method> <Method> <MethodName>foo</MethodName>

我有一个xml文件,名为Methods.xml,如下所示

....
<Method>
        <MethodName>foo</MethodName>
        <MethodParams>fooString1, fooString2</MethodParams>
</Method>
<Method>
        <MethodName>foo</MethodName>
        <MethodParams>fooString5, fooString6</MethodParams>
</Method>
    ....
我可以获得如下所示的节点值,我想根据xml文件节点的值动态调用该方法

XDocument _XDocument = XDocument.Load(@"Methods.xml");

var _XmlQuery = from _Element in _XDocument.Descendants("Method")
                select
                    new
                    {
                        _MethodName = _Element.XPathEvaluate("string(./MethodName)") as string,
                        _MethodParams = _Element.XPathEvaluate("string(./MethodParams)") as string,

                    };


foreach (var _Node in _XmlQuery)
{

    string _MethodName = _Node._Method.Trim();
    MethodInfo _Method = this.GetType().GetMethod(_MethodName);

    List<object> _Params = new List<object>();
    object[] _XmlParams = _Nodes.MethodParams.Split(',');
    foreach (object arg in XmlParams)
    {
        _Params.Add(arg);
    }
    _Method.Invoke(this, _Params.ToArray());

}
XDocument\u XDocument=XDocument.Load(@“Methods.xml”);
var_XmlQuery=from_XDocument.subjections(“方法”)中的_元素
选择
新的
{
_MethodName=_Element.xpatheValue(“字符串(./MethodName)”)作为字符串,
_MethodParams=_Element.xpatheValue(“字符串(./MethodParams)”)作为字符串,
};
foreach(XmlQuery中的var\u节点)
{
字符串_MethodName=_节点。_Method.Trim();
MethodInfo _Method=this.GetType().GetMethod(_MethodName);
列表_Params=新列表();
object[]_XmlParams=_Nodes.MethodParams.Split(',');
foreach(XmlParams中的对象参数)
{
_参数添加(arg);
}
_调用(这个,_Params.ToArray());
}
但是当我调试时,我在这个\u方法.Invoke(这个,\u Params.ToArray())中得到了错误

提前谢谢

已编辑


错误消息是:对象引用未设置为对象的实例。

默认情况下,
Type.GetMethod(string)
仅返回标记为public的方法

您需要传递一些
BindingFlags
选项:

...GetMethod( _MethodName,
  BindingFlags.Public |
  BindingFlags.NonPublic |
  BindingFlags.Instance
);

我尝试了一个简单的winforms应用程序,只需一个按钮。在click事件中调用方法foo。代码如下:

 private void button1_Click(object sender, EventArgs e)
    {
        MethodInfo val = this.GetType().GetMethod("Foo");
        val.Invoke(this, new object[] {"1", "2"});
    }

    public void Foo(string p1, string p2)
    {
        MessageBox.Show("");
    }

而且它工作得很好。如果我把Foo保密,我会得到和你一样的执行权。因此,您可以将Foo公开,或者必须在GetMethod方法中设置BindingFlags.public、BindingFlags.NonPublic和BindingFlags.Instance,错误详细信息是…?@Oded,错误消息是:对象引用未设置为对象的实例。您看到了吗?@Dave M,是的,我看到了那个问题。
 private void button1_Click(object sender, EventArgs e)
    {
        MethodInfo val = this.GetType().GetMethod("Foo");
        val.Invoke(this, new object[] {"1", "2"});
    }

    public void Foo(string p1, string p2)
    {
        MessageBox.Show("");
    }