web-dev-qa-db-fra.com

Méthodes d'appel utilisant des noms en C #

J'ai un certain nombre de "travaux" dans ma candidature. Chaque travail contient une liste de méthodes à appeler, ainsi que ses paramètres. On appelle essentiellement une liste contenant l'objet suivant:

string Name;
List<object> Parameters;

En résumé, lorsqu'un travail est exécuté, je souhaite énumérer cette liste et appeler les méthodes appropriées. Par exemple, si j'ai une méthode comme celle-ci:

TestMethod(string param1, int param2)

Mon objet de méthode serait comme ceci:

Name = TestMethod
Parameters = "astring", 3

Est-il possible de faire cela? J'imagine que la réflexion sera la clé ici.

17
Chris

Bien sûr, vous pouvez le faire comme ça:

public class Test
{
    public void Hello(string s) { Console.WriteLine("hello " + s); }
}

...

{
     Test t = new Test();
     typeof(Test).GetMethod("Hello").Invoke(t, new[] { "world" }); 

     // alternative if you don't know the type of the object:
     t.GetType().GetMethod("Hello").Invoke(t, new[] { "world" }); 
}

Le second paramètre de Invoke () est un tableau d'Object contenant tous les paramètres à transmettre à votre méthode.

En supposant que les méthodes appartiennent toutes à la même classe, vous pourriez avoir une méthode de cette classe quelque chose comme:

public void InvokeMethod(string methodName, List<object> args)
{
    GetType().GetMethod(methodName).Invoke(this, args.ToArray());
}
40
Igby Largeman

NuGet à la rescousse! PM> Install-Package dnpextensions

Une fois que vous avez ce package dans votre projet, tous les objets doivent maintenant avoir une extension .InvokeMethod(), qui prendra le nom de la méthode sous la forme d'une chaîne et d'un nombre quelconque de paramètres.

Cela utilise techniquement des "chaînes magiques" pour les noms de méthodes, donc si vous voulez taper fortement votre dictionnaire de méthodes, vous pouvez créer les clés de type MethodInfo et les obtenir comme ceci ...

MethodInfo[] methodInfos = typeof(MyClass).GetMethods();

Et alors vous pouvez faire quelque chose comme ça ...

var methods = new Dictionary<MethodInfo, Object[]>();
foreach (var item in methods)
   item.key.Invoke(null, item.value);  
   // 'null' may need to be an instance of the object that
   // you are calling methods on if these are not static methods.

Ou vous pouvez faire une variante du bloc ci-dessus en utilisant les extensions de fichier que j'ai mentionnées précédemment.

1
jrizzo

Si vous utilisez .NET Framework 4, examinez dynamic , sinon GetMethod , puis appelez Invoke de MethodInfo.

1
Kirill Polishchuk

Utilisez MethodBase.Invoke () . Devrait fonctionner jusqu'à .NET 2.0 avec System.Reflection.

0
Kongress