用于自动INotifyPropertyChanged实现的Resharper模板

时间:2011-07-03 10:59:54

标签: c# resharper inotifypropertychanged

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

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

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}

5 个答案:

答案 0 :(得分:8)

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

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

    set
    {

        if ($NAME1$ == value) return;

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

答案 1 :(得分:5)

如果您希望将其作为代码检查和快速修复,则可以创建结构替换模式。转到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

答案 2 :(得分:5)

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

搜索模式:

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

替换模式:

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

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

  1. Alt +输入属性名称 - >到具有支持字段的财产
  2. Alt +输入属性名称 - >应用我的自定义模板
  3. 这不是最好的解决方案,但它对我有用。

答案 3 :(得分:5)

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

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

    set
    {
        if (_$variableName$ != value)
        {
            _$variableName$ = value;
            RaisePropertyChanged(() => $PropertyName$);
        }
    }
}
  1. Resharper>模板资源管理器>新模板(图标)
  2. 粘贴代码段。
  3. 点击选择宏变量" variableName"
  4. 选择"另一个变量的值,第一个字符位于较低的"
  5. (可选)设置为"不可编辑"如果您使用" ALT + ENTER"用R#创建字段(该字段将在您的其他字段旁边创建。这可以避免复制/粘贴)
  6. 以下是最终R#Tempate的屏幕截图: RaisePropertyChanged Resharper Template

答案 4 :(得分:3)

Resharper 7+现在有built in