4

所以我的代码中有大量的视图模型和模型,它们要求每个属性都使用 ReactiveUI 方式来观察它们的变化:

private bool _myProperty;
public Boolean MyProperty
{
    get { return _myProperty; }
    set { this.RaiseAndSetIfChanged(ref _myProperty, value); }
}

使用 Resharper 我可以将其转换为:

public Boolean MyProperty { get; set; }

进入这个:

private bool _myProperty;
public Boolean MyProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

然后我必须手动将其转换为上面的第一个代码片段以合并我的 ReactiveUI 功能。

我想弄清楚的是,是否有一种方法可以为 Resharper 编写自定义重构,这将允许我在光标位于简单顶部时出现的工具菜单中添加“转换为反应性属性”快捷方式财产成员?(在已经存在的“转换为自动属性”和“转换为带有更改通知的属性”选项之上。

任何帮助是极大的赞赏!这将在编码时为我节省大量时间......

4

2 回答 2

10

开箱即用,ReSharper 支持 ReactiveUI 的ReactiveUI.raisePropertyChanged(string)重载以将自动属性转换为具有更改调用的属性,即:

变成这样:

进入这个:

这是通过 ReSharper 对 ReSharper 7 中引入的支持来INotifyPropertyChanged完成的。它的工作方式是,该ReactiveUI.raisePropertyChanged(string)方法使用 ReSharper 的 Annotation 属性进行修饰,称为[NotifyPropertyChangedInvocator]. 当使用特定签名装饰方法时,实现INotifyPropertyChanged接口的类型上的此属性将自动允许 ReSharper 将其用作“更改通知”重构。

在您的情况下,使用相对较少的代码,您可以使用相同的机制。但是,您的RaiseAndSetIfPropertyChanged方法需要具有特定的签名。你可以做的是,创建一个抽象类,派生自ReactiveObject,并在那里实现你的方法:

public abstract class ReactiveObjectBase : ReactiveObject
{
    [NotifyPropertyChangedInvocator]
    protected void RaiseAndSetIfPropertyChanged<T>(ref T obj, T value, string propertyName)
    {
        // call real raise method here
    }
}

这个方法需要有这个确切的签名(方法名称可能不同),并且必须用NotifyPropertyChangedInvocator属性修饰。

之后,只需将视图模型的基本类型更改为ReactiveObjectBase,现在您就可以将自动属性转换为更改通知:

希望这可以帮助!

于 2013-09-30T20:16:37.257 回答
2

我自己从未尝试过,但我一直想自己编写一个 R# 模板。根据这篇文章,这对你有用吗?

private $Type$ $BackingField$;
public $Type$ $Property$
{
  get
  {
    return this.$BackingField$;
  }
  set
  {
    this.RaiseAndSetIfPropertyChanged(ref $BackingField$, value); 
  }
}
于 2013-09-30T18:35:16.220 回答