Resharper自定义模式:忽略属性属性

时间:2012-02-23 09:02:05

标签: c# visual-studio-2010 resharper resharper-6.0

我正在编写一些Resarper Custom Patterns来警告我们一些需要注意的代码构造。其中一个是用lambda变量OnPropertyChanged(()=> propertyname)替换OnpropertyChanged(“String”)

我定义的搜索模式是:

 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$]
...

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

2 个答案:

答案 0 :(得分:2)

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

enter image description here

然后,您将通过搜索模式发出警告,并通过环绕模板进行替换 用法是:如果看到警告,请选择字符串,按Ctrl + E,Ctrl + U并选择模板 String to func returns property

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

答案 1 :(得分:0)

对于这样的任务,我使用了正则表达式。 VS支持用正则表达式替换,但有时它们挂起或只是工作很慢。但是在大多数情况下他们都会工作。

这对你有帮助吗?

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

不确定是否可以在Resharper替换模式中执行此操作。