65.9K
CodeProject 正在变化。 阅读更多。
Home

使用基于正则表达式的模板在 C# 中自定义 Getters Setters

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (9投票s)

2014 年 9 月 5 日

CPOL

4分钟阅读

viewsIcon

50361

downloadIcon

279

使用基于正则表达式的模板,快速为您的多个属性生成 Getter Setters。

引言

这里有一种快速生成 C# 中 Getter 和 Setter 的方法,使用基于正则表达式的模板。 基本上,我们在这里的输入是键值对,用分号 (;) 分隔 - 所以这个技巧可以用来快速生成任何模板化的文本,只要我们的输入导致匹配。 通过键值格式(我指的是类似 [ 属性名 属性类型; .... ] 的组合)。

背景

很多时候,我们希望像在 Eclipse 中那样批量生成 getter 和 setter,而且很多时候,我们还想为我们的 getter 和 setter 添加一些额外功能。 我们可以使用常规的 "prop"+TAB 和 "propfull"+TAB 技巧单独生成带有 getter 和 setter 的完整属性,但我们对模板的控制较少。

例如,假设我们希望进行 null 检查,并在我们的 setter 中调用 Notify 方法(如 wpf 的情况):-

private string _Text;
public string Text
{
get { return _Text; }
set {
  if ( value != _Text)
    { _Text= value;
      RaisePropertyChanged("Text");
    }
  }
}

所以首先想到的就是编写我们自己的代码片段,并在 Visual Studio 中重复使用它。 这是解决问题的一种方法。 我们可以使用代码片段设计器来完成此操作。 只需编写一个代码片段,然后按照我们通常调用 prop+TAB、propfull+TAB、ctor+TAB 等的方式来调用我们的自定义代码片段。

此外,如果我们想为多个属性执行此操作呢? 太多重复的打字操作,不是吗? 让我们尝试自动化它。

如果我只想输入 PropertyType 和 PropertyName,并且我可以生成其余的 getter 和 setter(并且我应该对正在生成的代码模板进行控制)怎么办。

这时,Expresso 来帮助我们了。 我们将使用正则表达式来匹配我们的属性并批量生成 getter 和 setter。 假设我有这些属性

Guid _Id;
string _Text;
DateTime _CreateDt;
DateTime _LastUpdateDt;
bool _IsDeleted;

我可以肯定的一件事是上述组合的结构是这样的:-

<PropertyType>+空格+下划线+<PropertyName>+分号

让我们将其翻译成正则表达式,并使用 Expresso 查找匹配项。

在正则表达式中,我会这样说:-

(<一个匹配单词的命名组>)+<一个或多个空格>+<下划线>+(<另一个匹配单词的命名组)+分号 => 这将翻译为

(?<PropType>\w+)\s+_(?<PropName>\w+);

在上述正则表达式中,\w 匹配一个单词。 \s 匹配空格。 + 表示一个或多个出现。 (_ 和 ; 保持原样)。

使用代码

上面附带(Zip 文件)的是一个 Expresso 项目 - 它使用 Expresso 打开(这是一个免费应用程序 - 链接如下)。 我们可以使用我们选择的应用程序。

基本上,我们的方法非常简单 - 我们只需要粘贴三个字符串(1. 正则表达式),(2. 模板),当然还有(3. 输入文本 [属性类型 _属性名;] 值)。 下面我们将逐步介绍在 Expresso 本身中执行此操作的过程。 在哪里获取 Expresso 和学习正则表达式,请点击这里:-

一旦我们将 Expresso 下载并安装到我们的机器上。 让我们在这里快速浏览一下我们的代码生成过程。 这是 Expresso UI 的外观。 屏幕的基本功能已注释:-

  1. 我们在正则表达式块中编写表达式
  2. 我们在“示例文本”块中输入要解析的示例文本或输入字符串
  3. 然后我们按下“运行匹配”来匹配字符串。

Expresso

我们输入了以下正则表达式和输入字段,以在匹配中查看结果:-

  1. 我们输入正则表达式
    1. (?<PropType>\w+)\s+_(?<PropName>\w+);
  2. 在“示例文本”中,我们按照常规语法输入了我们的 [ 属性类型 _属性名; ] 值,如下所示
  3. 单击“匹配”向我们显示结果

接下来,我们要创建用于生成所需代码的模板。 因此,我们需要转到“设计模式”选项卡,并在其中编写我们的模板,如下所示:-


  1. 转到“设计模式”
  2. 正则表达式与我们最近测试的相同。
  3. 使用我们使用正则表达式捕获的命名组编写我们的模板。 模板如下
    private ${PropType} _${PropName};
    
    public ${PropType} ${PropName}
            {
                get { return _${PropName}; }
                set {
                    if (_${PropName} != value)
                    {
                        _${PropName}= value;
                        RaisePropertyChanged("${PropName}");
                    }
            }
  4. 按下“替换”按钮(带有放大镜的蓝色页面上的按钮)

上面我正在做的事情很明显。 只是移动我使用我的正则表达式捕获的 PropName 和 PropType 命名组,并在它们之间填充我的模板。

我们点击“替换”,我们就在那里得到了 getter 和 setter:-

关注点

显然,我们希望了解正则表达式,这里是一个非常好的入门之地:-


 

历史

  • [2014 年 9 月 5 日]: 初始帖子。
  • [2014 年 9 月 6 日]: 更新了表达式和项目以进行更正。 添加了链接。
  • [2014 年 9 月 7 日]: 添加了 Expresso 版本 3.0 的链接(它是免费的)。
© . All rights reserved.