c# - ICommand - 我应该在 Execute 中调用 CanExecute 吗?

标签 c# wpf design-patterns command

鉴于 System.Windows.Input.ICommand 作为 2 个主要方法:

interface ICommand {
  void Execute(object parameters);
  bool CanExecute(object parameters);
  ...
}

我希望 CanExecute(...) 在调用 Execute(...) 之前在命令支持的框架中被调用。

但是,在我的命令实现内部,是否有任何理由在我的 Execute(...) 实现 中添加 CanExecute(...) 调用?

例如:

public void Execute(object parameters){
  if(!CanExecute(parameters)) throw new ApplicationException("...");
  /** Execute implementation **/
}

这在我的测试中变得很重要,因为我可能会模拟一些接口(interface)来支持 CanExecute,并且在测试 Execute 时必须做同样的模拟。

对此有什么设计思路吗?

最佳答案

程序员是出了名的懒惰,他们调用Execute而不先调用CanExecute

ICommand 接口(interface)更常与 WPF 绑定(bind)框架一起使用,但它是一种非常强大且有用的模式,可以在其他地方使用。

我立即从 Execute 方法调用 CanExecute 来验证对象的状态。它有助于减少重复逻辑并强制使用 CanExecute 方法(为什么要竭尽全力确定他们是否可以调用方法而不费心强制执行它?)。我没有发现多次调用 CanExecute 有什么问题,因为无论如何它应该是一个快速操作。

不过,如果 CanExecute 方法返回 false,我总是记录调用 Execute 方法的结果,以便消费者知道后果.

关于c# - ICommand - 我应该在 Execute 中调用 CanExecute 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6984257/

相关文章:

c# - WCF maxReceivedMessageSize 不能设置超过 4215

wpf - 在代码中而不是 XAML 中设置 DataContext 有什么好处?

c# - 在 GridViewColumn 按钮的单击事件处理程序中获取绑定(bind)项

c# - 在 C# 中执行包含 GO 语句的 SQL 批处理

c# - mysql 搜索多个字段

c# - 单击 DataGrid 元素打开新 View (WPF xaml 应用程序)

c++ - 基于抽象迭代器加速设计的想法

ios - 如何检查单例是否已经初始化?

php - 访问者模式对动态类型语言有用吗?

c# - ViewBag 不保存状态