使用基于正则表达式的模板在 C# 中自定义 Getters Setters
使用基于正则表达式的模板,快速为您的多个属性生成 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 的外观。 屏幕的基本功能已注释:-
- 我们在正则表达式块中编写表达式
- 我们在“示例文本”块中输入要解析的示例文本或输入字符串
- 然后我们按下“运行匹配”来匹配字符串。
我们输入了以下正则表达式和输入字段,以在匹配中查看结果:-
- 我们输入正则表达式
-
(?<PropType>\w+)\s+_(?<PropName>\w+);
-
- 在“示例文本”中,我们按照常规语法输入了我们的 [ 属性类型 _属性名; ] 值,如下所示
- 单击“匹配”向我们显示结果
接下来,我们要创建用于生成所需代码的模板。 因此,我们需要转到“设计模式”选项卡,并在其中编写我们的模板,如下所示:-
- 转到“设计模式”
- 正则表达式与我们最近测试的相同。
- 使用我们使用正则表达式捕获的命名组编写我们的模板。 模板如下
private ${PropType} _${PropName}; public ${PropType} ${PropName} { get { return _${PropName}; } set { if (_${PropName} != value) { _${PropName}= value; RaisePropertyChanged("${PropName}"); } }
- 按下“替换”按钮(带有放大镜的蓝色页面上的按钮)
上面我正在做的事情很明显。 只是移动我使用我的正则表达式捕获的 PropName 和 PropType 命名组,并在它们之间填充我的模板。
我们点击“替换”,我们就在那里得到了 getter 和 setter:-
关注点
显然,我们希望了解正则表达式,这里是一个非常好的入门之地:-
历史
- [2014 年 9 月 5 日]: 初始帖子。
- [2014 年 9 月 6 日]: 更新了表达式和项目以进行更正。 添加了链接。
- [2014 年 9 月 7 日]: 添加了 Expresso 版本 3.0 的链接(它是免费的)。