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.
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());
}
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.
Utilisez MethodBase.Invoke () . Devrait fonctionner jusqu'à .NET 2.0 avec System.Reflection
.