在您的情况下,您想使用delegate。
让我们看看委托是如何工作的,以及我们如何通过理解其概念来获得更简单的表单:
// Create a normal function
void OnButtonClick()
{
MessageBox.Show("Hello World!");
}
// Now we create a delegate called ButtonClick
delegate void ButtonClick();
你看,委托采用普通函数的形式,但没有任何参数(它可以像任何其他方法一样接受任意数量的参数,但为了简单起见,它没有)。
现在,让我们使用我们所拥有的;我们将像定义任何其他变量一样定义委托:
ButtonClick ButtonClicked = new ButtonClick(OnButtonClick);
我们基本上创建了一个名为 ButtonClicked 的新变量,它具有 ButtonClick 类型(它是一个委托),并且在使用时将执行 OnButtonClick() 方法中的方法。
要使用它,我们只需调用:ButtonClicked();
所以整个代码是:
delegate void ButtonClick();
void OnButtonClick()
{
MessageBox.Show("Hello World!");
}
void Foo()
{
ButtonClick ButtonClicked = new ButtonClick(OnButtonClick);
ButtonClicked(); // Execute the function.
}
从这里开始,我们可以转到 lambda 表达式,看看它们如何在您的情况下发挥作用:
.NET 库已经定义了许多委托,其中一些像 Action,它们不接受任何参数并且不返回值。定义为public delegate void Action();
您始终可以根据需要使用它,而不是每次都需要定义一个新的委托。例如,在前面的上下文中,您可能只是写了
Action ButtonClicked = new Action(OnButtonClick);
ButtonClicked();
它会做同样的事情。
现在您已经了解了如何使用委托的不同方式,让我们使用我们的第一个 lambda 表达式。 Lambda 表达式是匿名函数;因此,它们是正常功能,但没有名称。它们具有以下形式:
x => DoSomethingWithX(x);
(x) => DoSomethingWithX(x);
(x,y) => DoSometingWithXY(x,y);
() => Console.WriteLine("I do not have parameters!");
在我们的例子中,我们没有任何参数,所以我们将使用最后一个表达式。我们可以将其用作 OnButtonClick 函数,但我们获得了没有命名函数的优势。我们可以这样做:
Action ButtonClicked = new Action( () => MessageBox.Show("Hello World!") );
甚至更简单,
Action ButtonClicked = () => MessageBox.Show("Hello World!");
然后直接调用ButtonClicked();当然你也可以有多行代码,但我不想让你更困惑。它看起来像这样:
Action ButtonClicked = () =>
{
MessageBox.Show("Hello World!");
};
ButtonClicked();
你也可以玩转,例如,你可以执行一个这样的函数:
new Action(() => MessageBox.Show("Hello World!"))();
抱歉,帖子太长了,希望不要太混乱:)
编辑:我忘了提到另一种形式,即使不经常使用,也可以使 lambda 表达式更容易理解:
new Action(delegate() {
Console.WriteLine("I am parameterless");
})();
另外,使用泛型:
// Defines a delegate that has one parameter of type string. You could pass as many parameters as you want.
new Action<string>(delegate(string x) {
Console.WriteLine(x);
})("I am a string parameter!");
反过来,您可以使用 lambda 表达式,但您不需要(但在某些情况下可能)定义参数的类型,例如,上面的代码可以简单地写成:
new Action<string>(x => {
Console.WriteLine(x);
})("I am a string parameter!");
或:
new Action<string>(x => Console.WriteLine(x))("I am a string parameter!");
EDIT2:
Action<string> 是public void delegate Action(string obj); 的表示
Action<string,string> 是public void delegate Action(string obj, string obj2); 的表示
一般来说,Action<T>是public void delegate Action<T>(T obj);的表示
编辑3:
我知道这个帖子已经在这里有一段时间了,但我认为这真的很酷,不用提:
您可以这样做,这主要与您的问题有关:
dynamic aFunction = (Func<string, DialogResult>)MessageBox.Show;
aFunction("Hello, world!");
或者简单地说:
Func<string, DialogResult> aFunction = MessageBox.Show;
aFunction("Hello, world!");