在Javascript或Flash中,我习惯将回调传递给我的按钮对象,如下所示:
MAIN CLASS
function init() {
var myButton = new Button("red", doSomething);
}
function doSomething() {
log("someone clicked our button, but who?");
}
按钮类构造函数
function Button(color, callback) {
addListener(mouseClick, callback);
}
此示例大大简化,重点是您可以将函数名称作为参数传递给Button实例。单击该按钮后,该按钮将调用该功能。
这在C#中是否可行?我已经阅读了有关代表的内容,但无法找出一个简单的例子。
答案 0 :(得分:1)
使用UI控件(如按钮)的常规方法是将事件附加到它们。 .NET中的事件处理程序具有2个参数(object sender
和EventArgs e
)的标准化(但不是强制)格式。声明因您使用的UI框架而异。这是一个ASP.NET声明。
<asp:Button ID="btnDoSomething" runat="server" Text="Do Something" OnClick="btnDoSomething_Click" />
然后,代码隐藏文件将具有相应的事件处理函数来执行代码。
protected void btnDoSomething_Click(object sender, EventArgs e)
{
// Do something
}
传递函数
在C#中也可以传递函数。
最简单的语法(至少我认为是这样)是使用Func<T>
或Action<T>
类型。 Func<T>
映射到函数,Action<T>
映射到不返回结果的命令。
所以,你的例子的模拟就是这样的。
public class Button
{
private readonly string color;
private readonly Action callback;
public Button(string color, Action callback)
{
this.color = color;
this.callback = callback;
}
public void Click()
{
// This executes the callback action
this.callback();
}
}
class Program
{
static void Main(string[] args)
{
var myButton = new Button("red", DoSomething);
myButton.Click(); // Prints "Something was done" to the console.
}
private void DoSomething()
{
Console.WriteLine("Something was done");
}
}
这些类型中的每一个都有许多重载,允许您也定义输入参数类型,并且在Func<T>
的情况下输出返回类型。
答案 1 :(得分:0)
这很简单:
//Declare the function "interface"
delegate string UppercaseDelegate(string input);
//Declare the function to be passed
static string UppercaseAll(string input)
{
return input.ToUpper();
}
//Declare the methode the accepts the delegate
static void WriteOutput(string input, UppercaseDelegate del)
{
Console.WriteLine("Before: {0}", input);
Console.WriteLine("After: {0}", del(input));
}
static void Main()
{
WriteOutput("test sentence", new UppercaseDelegate(UppercaseAll));
}
答案 2 :(得分:-1)
似乎没有一种使用WinForms中的Button类在构造函数中分配回调的方法。但第二步很容易做到:
Button myButton = new Button("Text Displayed");
myButton.Click += (sender, args) => SomeFunction();