将接口添加到所有 类 具有特定命名模式

Add interface to all classes with a certain naming pattern

我希望重构大量 classes。

所有 classes 都遵循命名约定

class SomethingModel

我要全部找出来替换成

class SomethingModel : IModel

但我也想排除一些模板派生,我看起来像

class SomethingController : GenController<SomethingModel>

我正尝试在 Visual Studio 中执行此操作。

显而易见的选择是正则表达式查找和替换,但我也有 Resharper,理想情况下,我会使用模式搜索替换

通过对正则表达式问题的一些搜索,我得到了第一部分的工作

(?<=class)(.*Model)

但我似乎无法排除模板。我开始玩

(class .*Model)(?!"(?<="Generic"))

我很少使用正则表达式,如果有 none-regex 解决方案,我会更喜欢它。特别是我非常想将 Resharper Search 与 Pattern

一起使用

我尝试了以下操作: 效果非常好....除了我所有的 classes 都变成空的... statements 标签似乎不起作用(设置为无限)

更新

阳性案例:

负面案例

你可以尝试匹配

(?<=class\s)(\w+Model)(?!\s+:\s*(GenericController|IModel))

并像这样使用第一个捕获组替换

 : IModel

https://regex101.com/r/aMaPwF/4

如果您确实希望利用 Resharper,则有一个 hacky 解决方案。但它是一个黑客。

根据 Jetbrains 的说法,模式搜索和替换是为函数设计的,这就是为什么它不能很好地处理我上面的 class 示例(请参阅我的对话 here

我所做的是打开所有我想编辑的文件并进行查找替换以替换以让 resharper 忽略我的 class 内容。

我想要替换我的 resharper 模式,以便我可以替换这个模式:

class $ClassName$ : IModel
{

}

有了这个

class $ClassName$ : AbstractModel<$ClassName$s>{}

所以我只是做了一个查找替换,将“IModel”替换为“IModel{}//$$

然后 运行 resharper 模式替换,然后它起作用了,因为它显然不再 "see" class 的内容。

然后我将“>{}//$$”替换为“>”(因此出现了额外的疯狂符号)。

所以它很笨拙,但它确实有效。值得庆幸的是,你很少想做这样疯狂的事情(而且通常应该不惜一切代价避免这样做)。我实际上在弄乱这段代码时发现了其他一些 "Resharper hacks" ,稍后我可能不得不 post 。