Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代码分析避免了ExcessiveComplexity—只需设置命令即可_C#_Code Analysis_Maintainability - Fatal编程技术网

C# 代码分析避免了ExcessiveComplexity—只需设置命令即可

C# 代码分析避免了ExcessiveComplexity—只需设置命令即可,c#,code-analysis,maintainability,C#,Code Analysis,Maintainability,我有一个WPF表格,上面有16个按钮。当视图模型初始化时,我需要将所有16个对象都设置为RelayCommand对象。这就是我的Initialize()方法所做的一切,但这会导致代码分析错误CA1502:AvoidExcessiveComplexity 这是一个抑制CA警告的好例子,还是有一种更优雅的方法来设置这些命令而不导致CA冲突 [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity",

我有一个WPF表格,上面有16个按钮。当视图模型初始化时,我需要将所有16个对象都设置为RelayCommand对象。这就是我的Initialize()方法所做的一切,但这会导致代码分析错误CA1502:AvoidExcessiveComplexity

这是一个抑制CA警告的好例子,还是有一种更优雅的方法来设置这些命令而不导致CA冲突

[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()) {}