我有一个名为Methods.xml的xml文件,如下所示
....
<Method>
<MethodName>foo</MethodName>
<MethodParams>fooString1, fooString2</MethodParams>
</Method>
<Method>
<MethodName>foo</MethodName>
<MethodParams>fooString5, fooString6</MethodParams>
</Method>
....
我的方法如下
void foo(string param1, string param2)
{
MessageBox.Show(param1 +" : " + param2);
}
我可以获得如下的节点值,我想根据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());
}
但是当我调试时,我在 _Method.Invoke(this,_Params.ToArray()); 行中出错。
提前致谢。
EDITED
错误消息是:对象引用未设置为对象的实例。
答案 0 :(得分:3)
默认情况下,Type.GetMethod( string )
仅返回标记为公开的方法。
您需要传递一些BindingFlags
选项:
...GetMethod( _MethodName,
BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Instance
);
答案 1 :(得分:2)
我用一个简单的winforms-application尝试了它,只需一个按钮就可以了。在click-event中调用方法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-Method
设置BindingFlags.Public,BindingFlags.NonPublic和BindingFlags.Instance