【问题标题】:Resharper Custom Patterns: Ignore property attributesResharper 自定义模式:忽略属性属性
【发布时间】:2012-03-13 16:03:17
【问题描述】:

我正在编写一些 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 会丢弃属性上定义的属性。 这个sn-p:

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

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

【问题讨论】:

  • 您真的需要搜索整个属性吗?也许您可以搜索OnPropertyChanged($String$); 并将其替换为OnPropertyChanged(() => $String$);
  • 执行此操作时,OnpropertyChanges("test") 将替换为 OnPropertyChanged(() => "test")。测试占位符被定义为字符串类型的表达式。
  • 你是对的。这是我的错。

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


【解决方案1】:

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

然后,您将通过搜索模式获得警告,并通过环绕模板进行替换。
用法是:如果看到警告选择字符串,请按 Ctrl+E、Ctrl+U 并选择模板 String to func 返回属性

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

【讨论】:

  • +1 谢谢,当 jetbrains 社区论坛的结果是否定的时候我会接受它:-)
  • 收到@jetbrains 社区论坛的回答后我提出了一个问题:你好Yoeri 恐怕在这种情况下属性无法保留。欢迎您通过我们的错误跟踪器提出请求:youtrack.jetbrains.net/issues/RSRP。谢谢! Andrey Serebryansky 高级支持工程师 JetBrains, Inc
【解决方案2】:

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

这对你有帮助吗?

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

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

【讨论】:

  • 我们不打算全部替换。我们正在使用共享的 Resharper 设置并要求开发人员在签入前修复警告和错误。我们逐渐向 Resharper 添加新项目以提高代码的一致性。全部替换作为一次性操作很好,添加新代码时,resharper 检查也会突出显示。
  • 不知道 resharper 模式会产生警告。无论如何,resharper 似乎无法将正则表达式用于此类事情 - 也许您需要为其查找或编写插件。或者,也许您应该考虑使用 StyleCop+。它可以很容易地用手写插件扩展,可以警告这样的事情
  • 是的,在 resharper 中启用代码分析后,您可以触发警告、错误、建议或提示。它们导致代码被加下划线并引起开发人员的注意。我们始终希望签入文件不会出现更清晰的警告或错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多