2009-09-22 8 views
3

Сай, у меня есть XML-строки, как это,Calling 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()); 
    } 
Смежные вопросы