替换特定项目中类的使用

发布于 2024-12-08 14:09:21 字数 249 浏览 0 评论 0原文

我正在使用 VS2010 和 Resharper 5.1。

我有两个项目,一个库项目(Lib)和一个应用程序项目(App),App引用Lib。

Lib 包含一个类 X,该类在 App 和 Lib 中都使用。在应用程序中,我现在想用类 Y 替换 X 的所有用法。在我的例子中,Y 与 X 无关,但如果它使重构更容易,它可以从 X 继承。

我目前计划使用“查找用法”功能,按项目分组并逐一更改用法。有没有更简单/自动化的方法来做到这一点?

I'm using VS2010 with Resharper 5.1.

I have two projects, a library project (Lib) and an application project (App), App references Lib.

Lib contains a class X which is used in both App and Lib. In App i now want to replace all usages of X with class Y. In my case Y is unrelated to X, but it could inherit from X if it makes refactoring easier.

My current plan to use the "Find usages" feature, group by project and change the usages one by one. Is there an easier/automated way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

倾城泪 2024-12-15 14:09:21

结构搜索和替换是您的朋友。您可以通过 ReSharper | 获取它。查找|使用模式搜索...。

  • 定义一个 X 类型的占位符,将其命名为 TX
  • 使您的查找模式 $TX$
  • 指定为“Look in”“Project”
  • 作为检查,执行搜索 - 您应该看到 X 的所有用法
  • 单击“替换”切换按钮
  • 将替换模式设置为 Y 的完全限定名称
  • 单击替换

ReSharper 将向您显示它想要替换的所有提及的 X - 确保选中顶部的复选框选中该树,然后单击“替换”。

编辑

确实是通过在查找模式中使用类型占位符来确保仅引用类型 X ,而不是任何其他名为 X 的内容,都会被重命名。

如果您希望最终得到的结果

using A.B.C;

/* later */
Y obObject = ...

而不是

A.B.C.Y myObject

我认为的,您可以通过以下方式实现:

  1. 在 ReSharper | 中选项、工具| 选中“优化‘使用’指令”。
  2. 代码清理,定义一个新配置文件,其中仅在 ReSharper | 中 选项语言 | C# |命名空间导入ABC 添加到“应始终导入的命名空间”
  3. 使用刚刚定义的配置文件运行 ReSharper | Tools | Cleanup Code
  4. 通过删除 进行整理>ABC 从您添加到的名称空间列表中删除,

尽管这也会清除所有其他 using,这可能会使版本控制差异比您想要的要大一些。

Structural Search and Replace is your friend here. You get to it through ReSharper | Find | Search with Pattern....

  • Define a placeholder of type X, name it TX.
  • Make your Find pattern $TX$
  • Specify to "Look in" "Project"
  • As a check, carry out the search - you should see all the usages of X
  • Click the Replace toggle button
  • Make the Replace pattern the fully-qualified name of Y
  • Click Replace

ReSharper will show you all the mentions of X it wants to replace - ensure the checkbox at the top of the tree is checked, then click Replace.

edit

It is indeed by using a type placeholder in our Find pattern that ensure that only references to the type X, rather than anything else named X, are renamed.

If you would prefer to end up with

using A.B.C;

/* later */
Y obObject = ...

rather than

A.B.C.Y myObject

I think you can achieve this through:

  1. In ReSharper | Options, Tools | Code Cleanup, define a new profile which has just "Optimize 'using' directives" checked
  2. In ReSharper | Options, Languages | C# | Namespace Imports add A.B.C to "Namespaces that should always be imported`
  3. Run ReSharper | Tools | Cleanup Code using the profile you just defined
  4. Tidy up by removing A.B.C from the namespaces list you added it to

although this will also clean up all other usings, which might make the version control diff a bit larger than you want.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文