如何在ReSharper模式中提取字符串的内容?

时间:2011-03-24 12:00:13

标签: c# pattern-matching resharper-5.x

我遇到了以下问题:

我想替换包含具有LINQ成员表达式的属性名称的硬编码字符串

// like this:
NotifyOfPropertyChange("MyProperty");
// becomes
NotifyOfPropertyChange(() => MyProperty);

使用ReSharper模式。

以下尝试无效:

NotifyOfPropertyChange("$prop$"); // ($prop$ is of type Identifier, results in parse error)
NotifyOfPropertyChange($prop$); // ($prop$ is of type Expression [System.String],  
                                // almost works, but without removing the quotes

替换模式总是一样的:

NotifyOfPropertyChange(() => $prop$);

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我认为你不需要R#的结构搜索和替换(这是幸运的,因为我不认为在目前的版本中它可以做到这一点)。 Visual Studio的查找和替换正则表达式应该足够好:

Find What: 
NotifyPropertyChange\("{.*}"\)

( )被转义,以便他们成为一个分组结构; { }标记与模式匹配的任何内容,使其可用于替换表达式

Replace with:
NotifyPropertyChange(() => \1)

此处的所有内容都是文字,但\1除外,这意味着'第一个标记的表达式'。

答案 1 :(得分:0)

如果我理解你的意图,那么这可能会有所帮助。 前段时间我发现了这段代码(不记得是谁最初发布的)

public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
    {
        return (propertyExpression.Body as MemberExpression).Member.Name;
    }

以下内容:

NotifyPropertyChange( () => MyProperty)

应该给出结果:

NotifyPropertyChange("MyProperty")