2009-02-26 8 views
2

Je pense que la réponse à cette question peut être de la part des délégués, mais j'ai du mal à comprendre le concept des délégués. Le problème principal est que chaque explication et exemple de délégués que j'ai lus sont toujours sur les façons de faire quelque chose que vous pourriez accomplir sans délégués, alors pour moi, cela ne m'apprend rien. J'apprends mieux en voyant des exemples du monde réel.Passer un appel de procédure stockée d'un contexte de données LINQ à une autre méthode. C#

Maintenant que c'est à l'écart, voici ce que je veux accomplir. J'ai un contexte de données (.dbml) avec de nombreuses procédures stockées. J'ai aussi des situations où j'utilise exactement les 20 mêmes lignes de code pour mettre à jour une colonne dans une table, mais la seule différence à part utiliser une grille de données différente, c'est la procédure stockée appelée. Dans un effort de réduire la quantité de code utilisé, j'espérais un moyen de passer l'appel de procédure stockée à partir de l'objet de contexte de données en tant que paramètre. De cette façon, je peux déplacer tout ce code vers une fonction réutilisable. Est-ce seulement possible? J'utilise Visual Studio 2008 et C#.

Merci pour toute indication.

Répondre

1

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

+0

Merci beaucoup. Cela a beaucoup aidé. Je l'ai compris maintenant – Ziltoid

+0

Heureux mon tas d'écriture géant était utile :-) –

Questions connexes