C# 代码分析避免了ExcessiveComplexity—只需设置命令即可
我有一个WPF表格,上面有16个按钮。当视图模型初始化时,我需要将所有16个对象都设置为RelayCommand对象。这就是我的Initialize()方法所做的一切,但这会导致代码分析错误CA1502:AvoidExcessiveComplexity 这是一个抑制CA警告的好例子,还是有一种更优雅的方法来设置这些命令而不导致CA冲突C# 代码分析避免了ExcessiveComplexity—只需设置命令即可,c#,code-analysis,maintainability,C#,Code Analysis,Maintainability,我有一个WPF表格,上面有16个按钮。当视图模型初始化时,我需要将所有16个对象都设置为RelayCommand对象。这就是我的Initialize()方法所做的一切,但这会导致代码分析错误CA1502:AvoidExcessiveComplexity 这是一个抑制CA警告的好例子,还是有一种更优雅的方法来设置这些命令而不导致CA冲突 [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity",
[SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "Simply setting the commands")]
private void Initialize()
{
this.AddApplicationCommand = new RelayCommand(_ => AddApplication());
this.DeleteApplicationCommand = new RelayCommand(_ => DeleteApplication(), _ => ApplicationIsSelected);
this.RefreshApplicationsCommand = new RelayCommand(_ => RefreshApplications());
this.SaveApplicationCommand = new RelayCommand(_ => SaveApplication(), _ => ApplicationIsSelected);
this.ForceInstallationCommand = new RelayCommand(_ => ForceInstallation(), _ => ApplicationIsSelected);
this.DeleteForceInstallationCommand = new RelayCommand(_ => DeleteForceInstallation(), _ => ApplicationIsSelectedAndForceExists());
this.AddTaskCommand = new RelayCommand(_ => AddTask(), _ => ApplicationIsSelected);
this.EditTaskCommand = new RelayCommand(_ => EditTask(), _ => TaskIsSelected());
this.DeleteTaskCommand = new RelayCommand(_ => DeleteTask(), _ => TaskIsSelected());
this.ImportTasksCommand = new RelayCommand(_ => ImportTasks(), _ => ApplicationIsSelected);
this.ExportTasksCommand = new RelayCommand(_ => ExportTasks(), _ => TaskIsSelected());
this.ImportLegacyTasksCommand = new RelayCommand(_ => ImportLegacyTasks(), _ => ApplicationIsSelected);
this.MoveTaskUpCommand = new RelayCommand(_ => MoveRowUp(), _ => TaskIsSelected());
this.MoveTaskDownCommand = new RelayCommand(_ => MoveRowDown(), _ => TaskIsSelected());
this.AddVariableGroupCommand = new RelayCommand(_ => AddVariableGroup());
this.RemoveVariableGroupCommand = new RelayCommand(_ => RemoveVariableGroup(), _ => VariableGroupIsSelected());
}
看起来很可读,所以对我来说可以(假设您不能更改RelayCommand) 如果可以控制RelayCommand类,请添加构造函数
RealayCommand(Action,Func)
以消除额外的包装lambda/委托创建
如果您希望有更多按钮,请考虑用{按钮、动作、启用}条目切换到表。 编辑:通过删除可以更改代码的每一行上的代理来简化代码
new RelayCommand(_ => MoveRowDown(), _ => TaskIsSelected());
到
通过添加设置文件本身的新构造函数:
public RelayCommand(Action action, Func<bool> enabled)
{
this._execute = _ => action();
this._enabled = _ => enabled();
}
public RelayCommand(操作操作,功能已启用)
{
这个。_execute==>action();
这个。_enabled==>enabled();
}
或调用现有构造函数的新构造函数:
public RelayCommand(Action action, Func<bool> enabled)
: this(_ => MoveRowDown(), _ => TaskIsSelected()) {}
public RelayCommand(操作操作,功能已启用)
:此(=>MoveRowDown(),=>TaskIsSelected()){}
由于使用匿名方法,这是一个误报。该规则不将编译器生成的分支识别为生成的代码。有关现有的错误报告,请参阅和。我确实可以控制RelayCommand。不过我不明白,我已经在使用这个构造函数:public RelayCommand(Action execute,Predicate canExecute)。您的建议与使用它有何不同?您正在使用=>F()lambdas将零参数函数转换为一个参数,用于操作和谓词。如果你不需要这个转换代码,它将是更紧凑的中继(DeleteTask,IsApp)并且没有警告。我想我明白你现在说的了。由于my Action和Func不使用这些参数,请删除它们。唯一的问题是System.Windows.Input.ICommand指定:bool CanExecute(对象参数)。RelayCommand为WPF绑定实现ICommand。我试图建议您在新构造函数内部进行任何需要的转换,而不是在对现有构造函数的每次调用中重复。好的,那么如果我创建构造函数只是为了执行操作,如何将其转换为构造函数内的操作?
public RelayCommand(Action action, Func<bool> enabled)
: this(_ => MoveRowDown(), _ => TaskIsSelected()) {}