【问题标题】:Resharper template for automatic INotifyPropertyChanged implementation用于自动 INotifyPropertyChanged 实现的 Resharper 模板
【发布时间】:2011-09-27 14:18:01
【问题描述】:

是否可以编写代码模板或sn-p来执行以下操作:

我有一个这样声明的属性:

public string String1 {get;set;}

我希望 reshaprer 自动生成以下内容:

private string _string1;
public string String1
{
    get
    {
        return _string1;
    }

    set
    {

        if (_string1 != value)
        {
            _string1 = value;
            RaisePropertyChanged(() => String1);
        }
    }
}

刚刚阅读了http://koder.wordpress.com/2010/03/25/resharper-inotifypropertychanged/ 文章并创建了新的实时模板,它可以像我想要的那样为新属性插入代码。

是否可以通过这种方式设置此模板,当光标位于属性声明上时,它可以像建议一样出现在 Alt+Enter 菜单中

喜欢:

{Access modifiers} **{Type} {Name}** {Possible get;set; statements}

【问题讨论】:

标签: c# resharper inotifypropertychanged


【解决方案1】:

这是我想出的实时模板,我指定了“npp”来启动它。我不认为你可以 Ctrl-Shift-R 并替换它,但你可以删除旧的属性声明行并输入'npp'来调用模板。

private $TYPE$ $NAME1$;
public $TYPE$ $NAME2$
{
    get
    {
        return $NAME1$;
    }

    set
    {

        if ($NAME1$ == value) return;

        $NAME1$ = value;
        RaisePropertyChanged(() => $NAME1$);
    }
}

【讨论】:

  • 谢谢你,Ritch,但我有强烈的感觉,在 resharper 6 中你可以创建替换模板并将其设置为看起来像建议,如果我能找到它,我会在这里发布
  • @Dmitry - 不会感到惊讶。在他们修复 dotCover 集成之前,我不会运行 rc。
  • @Ritch Check dotCover 1.1.1 EAP: confluence.jetbrains.net/display/DCVR/… 它与 R#66 集成
  • 第二行应该是:public $TYPE$ $NAME2$
【解决方案2】:

我创建了一个稍微不同的自定义模板(ReSharper > 选项 > 代码检查 > 自定义模式)

搜索模式:

public $Type$ $Pname$
{
   get { return $FName$; }
   set { $FName$ = value; }
}

替换模式:

public $Type$ $Pname$
{
    get { return $FName$; }
    set { $FName$ = value; NotifyOnPropertyChanged(() => $Pname$); }
}

对于已创建的自动属性,我的工作流程如下:

  1. Alt+Enter on property name -> To Property with backing field
  2. Alt+Enter 属性名称 -> 应用我的自定义模板

这不是最好的解决方案,但它对我有用。

【讨论】:

    【解决方案3】:

    如果您希望将此作为代码检查和快速修复,您可以创建结构替换模式。转到 ReSharper > 选项 > 代码检查 > 自定义模式,单击添加模式,然后输入以下内容:

    搜索模式:

    public $type$ $name$ {get;set;}
    

    其中 $type$ 是 System.Object 或派生类型的类型占位符,$name$ 是标识符占位符。

    替换模式:

    private string _$name$;
    public string $name$
        {
            get
            {
                return _$name$;
            }
    
            set
            {
                if (_$name$ != value)
                {
                    _$name$ = value;
                    RaisePropertyChanged(() => $name$);
                }
            }
        }
    

    将 Pattern Severity 设置为特定的严重性级别,这会影响 ReSharper 在文本编辑器中突出显示匹配项的方式。 (可选)输入两种模式的描述,以便搜索模式描述关注问题(即“此常规属性可疑”),替换模式描述关注解决问题(即“替换为 INotifyPropertyChanged 实现”) 点击添加,您应该就完成了。

    现在这种方法有两个问题:

    1. 您无法影响 $name$ 占位符的大小写 - 部署后,ReSharper 很可能会通过“不一致的命名”检查为新属性着色
    2. 它在我的机器上不起作用:) 原始属性被突出显示,替换模式的快速修复在那里,但它只是不应用它。我需要睡觉或提交错误报告。更新:决定我都需要。这是bug report

    【讨论】:

    • 从 ReSharper 6.1 开始工作,非常有用!
    【解决方案4】:

    另一种可能是两个参数使用宏来小写私有变量的第一个字母:

    public $PropertyType$ $PropertyName$
    {
        get { return _$variableName$; }
    
        set
        {
            if (_$variableName$ != value)
            {
                _$variableName$ = value;
                RaisePropertyChanged(() => $PropertyName$);
            }
        }
    }
    
    1. Resharper > 模板资源管理器 > 新模板(图标)
    2. 粘贴代码 sn-p。
    3. 点击为变量“variableName”选择宏
    4. 选择“另一个变量的值,第一个字符在下”
    5. (可选) 如果您使用“ALT + ENTER”使用 R# 创建字段,则设置为“不可编辑”(该字段将在您的其他字段旁边创建。这样可以避免复制/粘贴)

    这是最终 R# Tempate 的屏幕截图:

    【讨论】:

      【解决方案5】:

      Resharper 7+ 现在有这个built in

      【讨论】:

      • 是的,除了它必须修改项目而且它几乎不能正常工作......但当它正常工作时真的很好。
      猜你喜欢
      • 2020-07-25
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多