虽然我无法在 sql/stored proc 方面为您提供帮助,但我可以尝试解释委托,至少从 C# 的角度来看是这样。
虽然通常您将函数声明为类的一部分(因此它们与类密切相关),但有时您希望将它们放入变量中。一旦你这样做了,你就可以传递它,就像你传递任何其他变量一样。
所以我们知道字符串是一种可以将文本粘贴到其中的变量。之后,委托是您将函数粘贴到其中的那种变量。然而,这非常令人困惑,因为 C# 与它在代码中命名事物的方式不一致或不清楚。观察:
public void WriteText() {
Console.WriteLine("Hello");
}
...
Action x = WriteText;
x(); // will invoke the WriteText function
请注意,我们使用“Action”,其中逻辑意味着代码应该读取delegate x = WriteText
。我们需要这种额外混乱的原因是因为“委托”本身就像System.Object
. 它不包含任何信息,它是一切背后的“基类”。如果我们真的想使用一个,我们必须附加一些类型信息。这就是Action
进来的地方。定义Action
如下:
public delegate void Action();
这段代码的意思是“我们正在声明一个名为 Action 的新委托,它不接受任何参数并返回 void ”。此后,如果您有任何不带参数并返回 void 的函数,则将它们放入 type 的变量中Action
。
现在,您可以将普通函数粘贴到委托中,但您也可以将“匿名”函数粘贴到委托中。“匿名”函数是您在内联声明的东西,因此WriteText
我们可以在代码中间构建一个新函数,而不是附加已经声明的函数,如下所示:
Action x = () => { Console.WriteLine("Hello"); };
x(); // invoke our anonymous function.
这样做是使用 C#“lambda 语法”来声明一个新的匿名函数。作为函数的一部分运行的代码(当我们调用它时)是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 而不需要委托