【问题标题】:Search and Replace based on typeof基于 typeof 的搜索和替换
【发布时间】:2015-06-22 08:17:24
【问题描述】:

我希望这里有人知道如何使用 Visual Studio 2013 按类型查找文本并替换它们。例如,我有一个使用运算符重载进行乘法的结构。因此,在我的整个程序中,我都有语句/表达式,例如 struct * struct。

我想更改所有这些以使用方法;例如,我想更改以下内容:

Vectro3 a;
Vector3 b;

Vector3 c = a * b;

到:

Vector3 a;
Vector3 b;

Vector3 c = Vector3.Mul(a, b);

有没有一种方法可以搜索 Vector3 类型与 Vector3 的倍数,而不是例如类型 float 倍数 float 的位置,然后将其替换为其他内容?

我需要将其更改为方法的原因是因为我将使用程序来内联计算,而不是使用运算符或方法。我有大约 8000 多个案例,所以手动操作会很痛苦。

我真的希望这里有人知道可以做到这一点的技术或程序。我在 Resharper 的 Refactor 中尝试了搜索模式,但是那个插件弄乱了我的整个代码。我可能用错了,如果有人知道如何在 Refactor 中使用搜索模式执行上述操作,请告诉我。

提前致谢!

【问题讨论】:

  • “使用程序内联计算而不是使用运算符或方法”是什么意思?
  • ReSharper 重构能够通过将方法调用替换为方法主体来内联方法调用。例如:“c = a * b”将被内联,看起来像这样:“ Vector3 tmp; tmp.x = ax* bx; tmp.y = ay* by; tmp.z = zy*by; c = tmp ;"为了我的目的,内联计算给了我巨大的性能提升。我正在为物理引擎使用固定数学,以确保跨所有平台的确定性。

标签: c# search visual-studio-2013 replace resharper


【解决方案1】:

一种可能性:打破 Vector3 上 * 的运算符重载,然后重建。无论您使用重载的*,这都会给您带来错误。修复那些。虽然不如一次性修复好,但至少能很快找到。

另一种可能性。当我在解决方案资源管理器中下拉一个类时,我可以下拉到我得到其方法列表的位置。然后我可以右键单击一个方法并选择“被调用者”或“被使用者”。同样,这不会为您执行替换,但它应该有助于找到所有用途,这仍然是一个帮助。

【讨论】:

    【解决方案2】:

    您应该能够在 ReSharper 中使用 Structural Search and Replace pattern。比如:

    Vector3 $id$ = $exp1$ * $exp2$
    

    $id$ 是一个标识符占位符,您几乎可以忽略它。 $exp1$$exp2$ 将是具有 Vector3 类型的表达式占位符(但具有完全限定的类型名称)。这应该足以找到所有乘法实例。

    然后你可以创建一个替换模式:

    Vector3 $id$ = Vector3.Mul($exp1$, $exp2$)
    

    并且 ReSharper 将用 this 替换与查找模式匹配的代码,将原始标识符以及原始表达式替换回来(这些可以是表达式,例如方法调用的返回值,而不仅仅是局部变量)。

    【讨论】:

    • 这就是我要提出的建议,但提问者说“我在 Resharper 的 Refactor 中尝试了搜索模式,但是那个插件弄乱了我的整个代码。”不知道为什么这个问题被标记为resharper :(
    • 我试过这样做,但 resharper 并没有做它应该做的事情。它把我的代码变成了这个奇怪的东西。但是,我有另一个想法,我要试一试
    • 什么是“奇怪的事情”?会发生什么?
    猜你喜欢
    • 1970-01-01
    • 2015-02-16
    • 2020-07-20
    • 1970-01-01
    • 2014-09-13
    • 2019-05-05
    • 2011-02-20
    • 2012-12-25
    相关资源
    最近更新 更多