2

我觉得这个问题的答案可能在于代表,但我很难理解代表的概念。主要问题是我读过的每一个代表的解释和例子总是围绕着做一些你可以在没有代表的情况下完成的事情的方法,所以对我来说它没有教给我任何东西。通过查看现实世界的例子,我学得最好。

既然这已经过去了,这就是我想要完成的事情。我有一个包含许多存储过程的数据上下文 (.dbml)。我也有多种情况,我使用完全相同的 20 行代码来更新表中的一列,但除了使用不同的数据网格之外,唯一的区别是调用了存储过程。为了减少使用的代码量,我希望有一种方法可以将数据上下文对象中的存储过程调用作为参数传递。这样我就可以将所有代码移动到一个可重用的函数中。这甚至可能吗?我正在使用 Visual Studio 2008 和 C#。

感谢您的任何指导。

4

1 回答 1

1

虽然我无法在 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 而不需要委托

于 2009-02-26T20:17:39.533 回答