2009-09-22 20 views
3

說參數,我有一個XML字符串這樣,調用C#方法從數據

<METHOD>foo</METHOD> 
<PARAM1>abc</PARAM1> 
<PARAM2>def</PARAM2> 
... 
<PARAM99>ghi</PARAM99> 
<PARAM100>jkl</PARAM100> 

,我有一個方法

void foo(String param1, String param2, ..., String param99, String param100) 
{ 
... 
} 

有我映射該字符串的簡單方法一個真正的方法調用的參數匹配的方法在C#中的參數名稱?

回答

8

假設你知道的類型,有它的一個實例,並且該方法實際上是公衆:

string methodName = parent.Element("METHOD").Value; 
MethodInfo method = type.GetMethod(methodName); 

object[] arguments = (from p in method.GetParameters() 
         let arg = element.Element(p.Name) 
         where arg != null 
         select (object) arg.Value).ToArray(); 

// We ignore extra parameters in the XML, but we need all the right 
// ones from the method 
if (arguments.Length != method.GetParameters().Length) 
{ 
    throw new ArgumentException("Parameters didn't match"); 
} 

method.Invoke(instance, arguments); 

注意,我做區分大小寫的名稱匹配在這裏,它不會與工作你的樣品。如果你想不區分大小寫,這會稍微困難一點,但仍然可行 - 我個人建議你儘可能使XML匹配方法。

(如果它是非公您需要提供一些結合標誌來調用GetMethod

0

編輯如果必須匹配構造函數中的名稱。只需要拋出構造函數,因爲它不是名稱/值的列表,而只是所需對象類型的列表,名稱不是必需的。使用屬性來匹配xml元素名稱和類中的字段。

2

怎麼是這樣的:

public void Run(XmlElement rootElement) 
    { 
     Dictionary<string, string> xmlArgs = new Dictionary<string,string>(StringComparer.OrdinalIgnoreCase); 
     foreach(XmlElement elem in rootElement) 
      xmlArgs[elem.LocalName] = elem.InnerText; 

     MethodInfo mi = this.GetType().GetMethod(xmlArgs["METHOD"]); 

     List<object> args = new List<object>(); 
     foreach (ParameterInfo pi in mi.GetParameters()) 
      args.Add(xmlArgs[pi.Name]); 

     mi.Invoke(this, args.ToArray()); 
    }