2009-09-22 9 views
3

Say, j'ai une chaîne XML comme celui-ci,appel C# méthode avec des paramètres à partir des données

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

et j'ai une méthode

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

est-il un moyen facile pour moi à la carte cette chaîne à un appel de méthode réelle avec les params correspondant aux noms de paramètres de la méthode en C#?

Répondre

8

En supposant que vous connaissez le type, ont une instance de celui-ci, et que la méthode est en fait publique:

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); 

Notez que je fais nom sensible à la casse correspondant ici, qui ne fonctionne pas avec votre échantillon. Si vous voulez être insensible à la casse, c'est un peu plus difficile, mais tout de même faisable - personnellement, je vous conseille de faire en sorte que le XML corresponde à la méthode si cela est possible.

(Si elle est non-publique, vous devez fournir des drapeaux de liaison à l'appel à GetMethod.)

0

éditer Si vous devez faire correspondre les noms dans le constructeur. Il suffit de rejeter le constructeur, car il ne s'agit pas d'une liste de noms/valeurs mais simplement d'une liste de types d'objets requis, et les noms ne sont pas nécessaires. Utilisez les propriétés pour faire correspondre le nom de l'élément xml au champ de la classe.

2

Que diriez-vous quelque chose comme ceci:

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()); 
    } 
Questions connexes