2010-10-20 6 views
1

Je vais commencer par ne pas avoir d'idée sur la terminologie à ce sujet ou si c'est même possible (je suis à peu près sûr que cela peut être fait).Exécuter une méthode par paramètre en C#

J'ai un morceau de code qui est essentiellement comme suit:

DataTable dt = new DataTable(); 

if (string = "this") 
    dt = method1(); 
else if (string = "that") 
    dt = method2(); 
else if (string = "somethingelse") 
    dt = method3(datetime, datetime2); 
else if (string = "anotherthing") 
    dt = method4(string); 
....and so on.... 

Je suis en train de faire ce nettoyeur. La chaîne de comparaison est dans une table. Ma pensée serait de faire quelque chose comme ce qui suit:

if (row.parmtype = "date"){ 
    dt = row.method(datetime, datetime2); 
else 
    dt = row.method(); 

donc la méthode que j'appelle seraient stockées dans la table ainsi que le type d'appel est (il n'y a que trois types jusqu'à présent). Chaque appel renvoie un DataTable. Puis-je soit obtenir un échantillon pour le meilleur encore, une ressource sur la façon de le faire?

Réaliser que puisque je ne sais pas de quoi je parle, le code ci-dessus n'est pas exactement ce que je cherche, mais est dans le but de faire passer mon message.

Répondre

2

vous pouvez faire un dictionnaire comme

var delegates = new Dictionary<string, Func<MyClass, DataTable>>() 
           { 
            {"somestr", x => x.Method1()} 
           }; 

      if (delegates.ContainsKey(key)) 
       delegates[key](this); 
+0

Cela semble être ce que je cherche. Merci! –

1

Vous avez deux options (du haut de ma tête) que le travail dans pratiquement toute version du cadre:

  • Changez votre « si » l'imbrication structure à une switch
  • vous pouvez utiliser reflection sur l'objet si vous appelez des fonctions connues sur l'objet
  • Enfin, vous pouvez utiliser un Command Pattern à implémentez une fonction "execute" commune et faites ce que vous décrivez ci-dessus en passant la commande et les données à l'objet et en le laissant décider quoi faire.
  • Vous pouvez également regarder dans delegates and events en fonction de vos besoins et

Tout ceux-ci devraient travailler en fonction de vos besoins, le plus simple « étape suivante » d'où vous êtes est de changer probablement une instruction switch puis regardez en utilisant le modèle de commande. La réflexion peut être géniale, mais coûteuse si vous le faites à un volume élevé et que vous ne prenez pas soin d'utiliser une bonne mise en cache. Fasterflect peut vous aider si vous décidez d'aller dans cette direction. Dans .NET 4.0 (peut-être 3.5), vous pouvez également utiliser les arbres dynamiques et d'expression pour faire quelque chose de similaire, mais cela peut être plus de code que vous voulez écrire pour votre implémentation actuelle.

Questions connexes