Rob*_*etz 4 c# resharper refactoring reactiveui resharper-8.0
所以我的代码中有大量的视图模型和模型,要求每个属性使用ReactiveUI方式来观察它们的变化:
private bool _myProperty;
public Boolean MyProperty
{
get { return _myProperty; }
set { this.RaiseAndSetIfChanged(ref _myProperty, value); }
}
Run Code Online (Sandbox Code Playgroud)
使用Resharper我可以转换它:
public Boolean MyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)
进入:
private bool _myProperty;
public Boolean MyProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
Run Code Online (Sandbox Code Playgroud)
然后我必须手动将其转换为上面的第一个代码片段,以便合并我的ReactiveUI功能.
我想弄清楚的是,是否有办法为Resharper编写自定义重构,这将允许我在光标位于简单顶部时出现的工具菜单中添加"转换为反应属性"快捷方式物业会员?(已经存在的'转换为自动财产'和'转换为具有变更通知的财产'选项已经存在).
任何帮助是极大的赞赏!这样可以节省我编码的时间TON ...
Iga*_*nik 10
开箱即用,ReSharper支持ReactiveUI的ReactiveUI.raisePropertyChanged(string)重载,将自动属性转换为具有更改调用的属性,即:
结果如下:

进入:

这是通过ReSharper 对INotifyPropertyChanged ReSharper 7中引入的支持来完成的.它的工作方式是该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
}
}
Run Code Online (Sandbox Code Playgroud)
此方法需要具有此精确签名(方法名称可能不同),并且必须使用该NotifyPropertyChangedInvocator属性进行修饰.
之后,只需将视图模型的基本类型更改为ReactiveObjectBase,现在您就可以将自动属性转换为更改通知:

希望这可以帮助!