2013-03-09 81 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 
);