5

我正在编写一些 Resarper 自定义模式来警告我们一些需要注意的代码结构。其中之一是将 OnpropertyChanged("String") 替换为 lambda 变体 OnPropertyChanged(() => propertyname)

我定义的搜索模式是:

 public $type$ $property$
 {
            get { return $backingfield$; }
            set
            {
                if($backingfield$  != value) {
                    $backingfield$ = value;
                    OnPropertyChanged($String$);
                }
           }
 }

此模式正在替换为:

public $type$ $property$
{
        get { return $backingfield$; }
        set
        {
            if($backingfield$  != value) {
                $backingfield$ = value;
                OnPropertyChanged(() => $property$);
            }
        }
}

问题: 应用此功能时,Resharper 会丢弃属性上定义的属性。这个片段:

[MyAttribute]
public int Test
{
            get { return _Test; }
            set
            {
                if (_Test != value)
                {
                    _Test = value;
                    OnPropertyChanged("Test");
                }
            }
}

被替换为

public int Test
{
            get { return _Test; }
            set
            {
                if (_Test != value)
                {
                    _Test = value;
                    OnPropertyChanged(() => Test);
                }
            }
}

我怎样才能保留属性?

更新:将派生自 System.Attribute 的类型占位符添加到搜索和替换模式可以部分修复它。

[$Attributes$]
...

剩下的问题是 Attribute 占位符只匹配一个属性,它在多个属性上失败。

4

2 回答 2

2

如果您无法获得其他解决方案,则有一种解决方法。
您使用搜索模式(不使用替换模式)来显示警告。我认为这已经奏效了。
然后创建一个环绕模板,将字符串替换为()=>PropName。看图片的例子:

在此处输入图像描述

然后你有搜索模式的警告和环绕模板的替换。
用法是:如果看到警告选择字符串,请按 Ctrl+E、Ctrl+U 并选择模板字符串以 func 返回属性

当然,字符串选择很麻烦。但这是迄今为止我发现的最好的。

于 2012-02-23T12:37:51.173 回答
0

对于此类任务,我使用了正则表达式。VS 支持用正则表达式替换,但有时它们会挂起或工作很慢。然而,在大多数情况下,它们都有效。

这会对你有帮助吗?

更新。正如 brgerner 建议的那样,您不需要在替换组中拥有所有属性,您只需要转换一个字符串。例如搜索正则表达式是OnPropertyChanged\("{:w*}"\);,替换字符串是OnPropertyChanged(() => \1);

不确定您是否可以在 Resharper 替换模式中做到这一点。

于 2012-02-23T09:23:43.247 回答