【问题标题】:How to create a custom pattern to replace `as` cast with direct cast in Resharper?如何创建自定义模式以在 Resharper 中用直接转换替换“as”转换?
【发布时间】:2013-05-05 10:20:50
【问题描述】:

我有很多这样的代码:

ml = this.CriteriaList.ItemByName(SC_STATIONS) as MultiList;

我想用

替换它
ml = (MultiList) this.CriteriaList.ItemByName(SC_STATIONS);

为此,我进入了 Resharper 选项,选择了自定义模式并创建了一个具有以下搜索模式的新模式:

`$expr1$ as $type1$;`

expr1 表示表达式,type1 表示类型。替换模式是($type1$) $expr1$;

问题是 Resharper 永远找不到与此自定义模式匹配的任何内容。
我在这里错过了什么?

【问题讨论】:

  • 是否必须在 ReSharper 上?
  • @AndreCalil 它没有。
  • 你为什么要这样做?你知道不同的语法实际上意味着不同的东西吗?
  • @AngryHacker 这是你之前问过的stackoverflow.com/q/16471489/275751 的重复,或者说是延续,不是吗?
  • @LasseV.Karlsen:就个人而言,我看到作者使用as 语法而不是 (type) 语法的代码没有利用@987654330 这一事实如果强制转换失败,@ 返回 null。这意味着,当演员确实失败时,您将在一段时间后得到NullReferenceException

标签: c# .net refactoring resharper resharper-7.1


【解决方案1】:

这会起作用,尽管它不在 ReSharper 上。

打开 Visual Studio 替换窗口 (CTRL + H),打开 使用正则表达式 选项并使用以下术语:

  • 查找:(.*)(\s|\((?!\))|\=)(.+) as (\w+)(\).*|;)
  • 替换:$1$2($4)$3$5

注意:如果您使用的是 VS2010,则应使用 {} 而不是 ()\ 而不是 $。去图...

【讨论】:

  • 恐怕,它并没有真正起作用,但我看到了潜力。以下行:Selected_AE = (this.CriteriaList.ItemByName(ReportCommon.CRITERIA_AES_VIERO) as MultiList).SelectedValues.Count; 被转换为 Selected_AE = (MultiList).SelectedValues.Count) (this.CriteriaList.ItemByName(ReportCommon.CRITERIA_AES_VIERO);
  • 你还会发现它会匹配任何包含'as'的字符串或cmets,并交换它之前和之后的单词。
  • @PiersMyers 的确,只要评论有(anything) = (anything) as (anything);的语法,这有点尴尬的评论
  • @JohnSaunders 在问题下阅读我的评论
  • @AngryHacker 已编辑,您能再试一次吗?
【解决方案2】:

这个 Resharper 自定义模式似乎可以满足您的需求:

我用来测试这个模式的小程序是:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var b = FooFactory() as bar;
        }

        static private foo FooFactory()
        {
            return new foo();
        }
    }

    class foo {}

    class bar : foo {}
}

它应该在FooFactory() as bar 下放置一条摆动线,为您提供将其替换为(bar)FooFactory() 的选项

添加 var ml = CriteriaList.ItemByName(SC_STATIONS) as MultiList; 并在此自定义模式上执行“立即搜索”给了我这个:

【讨论】:

  • 我就是这么做的。单击保存,然后按“自定义模式”对话框上的“搜索”按钮,查看是否找到任何内容。我找不到任何东西。
  • @AngryHacker 多么奇怪,您是否尝试过将其作为“使用模式搜索”?你确定你选择了c#?我的测试是在 VS2010 和 Resharper 7.1.2 中完成的
  • 在我的盒子上,它还可以找到简单的表达式,例如var b = FooFactory() as bar。试试我的例子:ml = this.CriteriaList.ItemByName(SC_STATIONS) as MultiList;
  • 即使没有定义 CriteriaListSC_STATIONSMultiList,也适用于我。
猜你喜欢
  • 1970-01-01
  • 2021-04-07
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
相关资源
最近更新 更多