我可以在=>运算符之后合并一个方法的多个调用吗?

时间:2018-07-30 01:53:51

标签: c#

我正在使用这种方法来设置和获取属性:

bool _selectEnabled;
public bool SelectEnabled
{
   get => _selectEnabled;
   set => SetProperty(ref _selectEnabled, value);
}

和:

protected virtual bool SetProperty<T>(
     ref T backingStore, T value,
     [CallerMemberName]string propertyName = "",
     Action onChanged = null)
{
   if (EqualityComparer<T>.Default.Equals(backingStore, value))
      return false;

      backingStore = value;
      onChanged?.Invoke();
      OnPropertyChanged(propertyName);
      return true;
}

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = "") 
      => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

这很好用,但是有时候我需要做的不仅仅是设置和获取。例如此处:

bool _selectEnabled;
public bool SelectEnabled {
    get { return _selectEnabled; }
    set { if (value != _selectEnabled) {
        _selectEnabled = value;
        OnPropertyChanged("SelectEnabled");
        // I need to call a method after the set. The methods
        // will be different for each property.
        myMethod("ABC", _selectEnabled);
       }
    }
 }

我可以调用另一个方法吗?

bool _selectEnabled;
public bool SelectEnabled
{
    get => _selectEnabled;
    set => { SetProperty(ref _selectEnabled, value);
                myMethod("ABC", _selectEnabled); }
}

我知道这种方式行不通,但是有办法吗?

谢谢

2 个答案:

答案 0 :(得分:4)

否,arrow operator(也称为粗箭头)用于表示表达式的成员时,用于表示表达式,可以将其视为单个语句。因此,如果要执行两个语句,则不能使用它们。

只需像在c#6之前那样做:

bool _selectEnabled;
public bool SelectEnabled
{
    get => _selectEnabled;
    set
    { 
        SetProperty(ref _selectEnabled, value);
        myMethod("ABC", _selectEnabled); 
    }
}

答案 1 :(得分:1)

是的,有一种方法;但这仅仅是因为您的示例显示了一些代码,如果该属性的值已更改(即并非无条件调用),则需要调用该代码。

您显示的SetProperty方法声明具有一个onChanged参数,该参数是仅在值更改后才调用的Action。所以你可以这样写:

set => SetProperty(ref _selectEnabled, value,
    onChanged: () => myMethod("ABC", _selectEnabled));

可以也可以扩展该方法,以允许您以类似方式提供无条件代码;但是我会说这是一个坏主意(这是一个湿滑的斜坡)。如果您要无条件执行,请参考Camilo的答案。