虽然我无法在 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 的函数,请将它们放入 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 而无需委托