2013-03-09 42 views
2

我有一个XML文件,其是名称Methods.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

错误消息是:对象没有设置为一个对象的一个​​实例。

+7

和错误细节是......? – Oded 2013-03-09 13:40:36

+0

@Oded,错误消息是:对象引用未设置为对象的实例。 – Kerberos 2013-03-09 13:45:34

+0

您是否看到此[问题](http://stackoverflow.com/q/1461748/229858)? – 2013-03-09 13:47:00

回答

2

我用一个简单的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是私人的,那么我得到和你一样的执行力。所以,你可以让公众美孚,或者你必须设置BindingFlags.Public,BindingFlags.NonPublic和BindingFlags.Instance在实现getMethod法

3

默认情况下,Type.GetMethod(string)只返回被标记为公共方法。

你需要传递一些BindingFlags选项:

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