SQL/ストアド プロシージャの側面についてはお手伝いできませんが、少なくとも C# の観点からデリゲートについて説明することはできます。
通常、関数はクラスの一部として宣言します (そのため、関数はクラスに強く関連付けられます) が、変数に入れたい場合もあります。これを行ったら、他の変数の場合と同じように、それを渡すことができます。
したがって、文字列はテキストを挿入する一種の変数であることがわかります。それに続いて、デリゲートは、関数を貼り付ける一種の変数です。ただし、C# はコード内で名前を付ける方法と一貫性がなく、明確でないため、これは非常に紛らわしいものです。観察:
public void WriteText() {
Console.WriteLine("Hello");
}
...
Action x = WriteText;
x(); // will invoke the WriteText function
ロジックがコードが読み取る必要があることを意味する「アクション」を使用していることに注意してくださいdelegate x = WriteText
。この余分な混乱が必要な理由は、「デリゲート」自体がSystem.Object
. 情報は含まれておらず、すべての背後にある「基本クラス」のようなものです。実際に使用したい場合は、いくつかの Type 情報を添付する必要があります。ここでAction
出番です。 の定義Action
は次のとおりです。
public delegate void Action();
このコードは、「Action という名前の新しいデリゲートを宣言しています。これはパラメーターをとらず、void を返します」と述べています。その後、パラメーターを取らずに void を返す関数がある場合は、それらを type の変数に入れますAction
。
これで、通常の関数をデリゲートに貼り付けることができますが、「匿名」関数をデリゲートに貼り付けることもできます。「匿名」関数はインラインで宣言するものであるため、既に宣言されている関数をアタッチするのではなく、WriteText
次のようにコードの途中で新しい関数を構築できます。
Action x = () => { Console.WriteLine("Hello"); };
x(); // invoke our anonymous function.
これが行っていることは、C# の「ラムダ構文」を使用して新しい無名関数を宣言することです。関数の一部として (関数を呼び出したときに) 実行されるコードはConsole.WriteLine
.
それで
すべてをまとめるには、「SaveData」関数を作成し、デリゲートに渡すことができます。20 行のテーブル構築を行い、そのテーブルをデリゲートに渡すと、デリゲートは適切なストアド プロシージャを呼び出すことができます。簡単な例を次に示します。
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
それで
そのすべてを言った。これは、私が実際に問題を解決する方法ではありません。デリゲートを savedata 関数に渡すよりも、単に SaveData 関数がテーブルを返すようにする方が理にかなっており、デリゲートをまったく必要とせずに適切な StoredProc を呼び出すことができます。