Bien que je ne puisse pas vous aider avec le côté sq/process enregistré, je peux essayer les délégués, au moins du point de vue C#.
Normalement, vous déclarez les fonctions comme faisant partie d'une classe (et donc elles sont fortement attachées à la classe), parfois vous voulez les placer dans une variable. Une fois que vous faites cela, vous pouvez alors le faire circuler, un peu comme avec n'importe quelle autre variable. Nous savons donc qu'une chaîne est le type de variable dans lequel vous collez du texte.
Après cela, un délégué est le type de variable que vous collez fonctions dans. Ceci est cependant très confus, car C# n'est pas cohérent ou clair avec la façon dont il nomme les choses dans votre code. Observer:
public void WriteText() {
Console.WriteLine("Hello");
}
...
Action x = WriteText;
x(); // will invoke the WriteText function
note que nous utilisons "Action" où la logique impliquerait le code devrait lire delegate x = WriteText
. La raison pour laquelle nous avons besoin de ce désordre supplémentaire est parce que "déléguer" lui-même est comme System.Object
. Il ne contient aucune information, et c'est un peu la «classe de base» derrière tout. Si nous voulons en utiliser un, nous devons joindre des informations de type. C'est là Action
vient dans la définition de Action
est la suivante:.
public delegate void Action();
Qu'est-ce que ce code est dit « nous annonçons un nouveau délégué a appelé l'action, et il ne prend aucun paramètre et retourne void ». Par la suite, si vous avez des fonctions qui ne prennent pas non plus de paramètres et renvoient void, vous les mettez dans des variables de type Action
.
Maintenant, vous pouvez coller une fonction normale dans un délégué, mais vous pouvez également coller une fonction "anonyme" dans un délégué. Une fonction « anonyme » est quelque chose que vous déclarez en ligne, donc plutôt que de fixer la fonction WriteText
déjà déclarée, nous pourrions construire une nouvelle au milieu de notre code comme ceci:
Action x =() => { Console.WriteLine("Hello"); };
x(); // invoke our anonymous function.
Ce que cela fait utilise la syntaxe lambda C# pour déclarer une nouvelle fonction anonyme. Le code qui s'exécute dans le cadre de la fonction (lorsque nous l'invoquons) est le Console.WriteLine
.
SO
Pour mettre tout cela ensemble, vous pourriez avoir une fonction « SaveData », et le transmettre un délégué.Il pourrait faire ses 20 lignes de construction de table, puis passer cette table au délégué, et le délégué pourrait invoquer le processus stocké approprié. Voici un exemple simple:
public void SaveData(Action<Table> saveFunc){
var t = new Table();
... 20 lines of code which put stuff into t ...
saveFunc(t);
}
SaveData(t => StoredProc1.Invoke(t)); // save using StoredProc1
SaveData(t => StoredProc37.Invoke(t)); // save using StoredProc37
SO
Après avoir dit tout cela. Ce n'est pas comme ça que je réglerais le problème. Plutôt que de passer le délégué dans votre fonction savedata, il serait plus logique d'avoir votre fonction SaveData simplement retourner la table, et ensuite vous pourriez invoquer le StoredProc approprié sans avoir besoin de délégués du tout
Merci beaucoup. Cela a beaucoup aidé. Je l'ai compris maintenant – Ziltoid
Heureux mon tas d'écriture géant était utile :-) –