用于自动INotifyPropertyChanged实现的Resharper模板

v00*_*d00 13 c# resharper inotifypropertychanged

是否可以编写代码模板或代码片段,它将执行以下操作:

我有一个声明如下的属性:

public string String1 {get;set;}
Run Code Online (Sandbox Code Playgroud)

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

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

    set
    {

        if (_string1 != value)
        {
            _string1 = value;
            RaisePropertyChanged(() => String1);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

喜欢:

{Access modifiers} **{Type} {Name}** {Possible get;set; statements}
Run Code Online (Sandbox Code Playgroud)

Rit*_*ton 8

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

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

    set
    {

        if ($NAME1$ == value) return;

        $NAME1$ = value;
        RaisePropertyChanged(() => $NAME1$);
    }
}
Run Code Online (Sandbox Code Playgroud)


Jur*_*sky 5

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

搜索模式:

public $type$ $name$ {get;set;}
Run Code Online (Sandbox Code Playgroud)

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

替换模式:

private string _$name$;
public string $name$
    {
        get
        {
            return _$name$;
        }

        set
        {
            if (_$name$ != value)
            {
                _$name$ = value;
                RaisePropertyChanged(() => $name$);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 你没有办法影响$ name $占位符的大小 - 在部署之后,ReSharper很可能会通过"不一致的命名"检查为新属性着色
  2. 它在我的机器上不起作用:)原始属性突出显示,替换模式的快速修复就在那里,但它不适用它.我要么睡觉要么提交错误报告.更新:决定我需要两者.这是错误报告


nem*_*esv 5

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

搜索模式:

public $Type$ $Pname$
{
   get { return $FName$; }
   set { $FName$ = value; }
}
Run Code Online (Sandbox Code Playgroud)

替换模式:

public $Type$ $Pname$
{
    get { return $FName$; }
    set { $FName$ = value; NotifyOnPropertyChanged(() => $Pname$); }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ste*_*uhr 5

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

public $PropertyType$ $PropertyName$
{
    get { return _$variableName$; }

    set
    {
        if (_$variableName$ != value)
        {
            _$variableName$ = value;
            RaisePropertyChanged(() => $PropertyName$);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. Resharper>模板资源管理器>新模板(图标)
  2. 粘贴代码段.
  3. 单击选择变量"variableName"的宏
  4. 选择"第一个字符在较低位置的另一个变量的值"
  5. (可选)如果使用"ALT + ENTER"创建带有R#的字段,则设置为"不可编辑"(将在其他字段旁边创建字段.这样可以避免复制/粘贴)

以下是最终R#Tempate的屏幕截图: RaisePropertyChanged Resharper模板