3

我希望在我的自定义 XNA GUI 中创建一个 Button 类,该类接受方法作为参数,类似于在 Python 中tkinter您可以设置要调用的函数 Button.config(command = a_method)

我已经阅读过在这里这里这里使用委托作为参数,但我似乎离让它工作更近了一步。我不完全理解代表是如何工作的,但是我尝试了几种不同的方法都没有成功,比如使用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;
    }
  }
}

但似乎我尝试过的一切都没有成功。

4

3 回答 3

1

默认参数必须是编译时间常数。在 C# 中,委托不能是常量。您可以通过在实现中提供自己的默认值来获得类似的结果。(这里只使用 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");
    }
于 2012-08-23T18:58:27.583 回答
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;
    }
  }
}
于 2012-08-23T18:40:41.790 回答
0

你得到的关于Func<T>不能为空的错误是正确的——它是一个引用类型,只有值类型可以为空。

要将Func<T>参数默认为null,您可以简单地编写:

Func<int> command = null
于 2012-08-23T18:54:33.400 回答