我想在我的自定义XNA GUI中创建一个Button类,它接受方法作为参数,类似于Python的tkinter
中你可以设置用Button.config(command = a_method)
调用的函数。
我已经阅读过将代理作为参数here,here和here使用,但我似乎没有更接近于让它工作。我不完全理解代表的工作方式,但我尝试了几个不同的事情,比如使用Func<int>? command = null
以便稍后测试command
是null
然后我会调用预设的默认值,但我得到Func cannot be nullable type
或类似的东西。
理想情况下,代码类似于:
class Button
{
//Don't know what to put instead of Func
Func command;
// accepts an argument that will be stored for an OnClick event
public Button(Action command = DefaultMethod)
{
if (command != DefaultMethod)
{
this.command = command;
}
}
}
但似乎我尝试的一切都没有成功。
答案 0 :(得分:1)
默认参数必须是编译时常量。在C#中,Delegates不能是常量。您可以通过在实现中提供自己的默认值来实现类似的结果。 (这里只使用Winforms)
private void button1_Click(object sender, EventArgs e)
{
Button(new Action(Print));
Button();
}
public void Button(Action command = null)
{
if (command == null)
{
command = DefaultMethod;
}
command.Invoke();
}
private void DefaultMethod()
{
MessageBox.Show("default");
}
private void Print()
{
MessageBox.Show("printed");
}
答案 1 :(得分:0)
如果您对默认值感兴趣,会这样吗?
class Button
{
//Don't know what to put instead of Func
private readonly Func defaultMethod = ""?
Func command;
// accepts an argument that will be stored for an OnClick event
public Button(Action command)
{
if (command != defaultMethod)
{
this.command = command;
}
}
}
答案 2 :(得分:0)
你得到的关于Func<T>
不可为空的错误 - 它是一个引用类型,只有值类型可以为空。
要将Func<T>
参数默认为null
,您只需输入:
Func<int> command = null