首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Roslyn确定唯一标识符名

使用Roslyn确定唯一标识符名
EN

Stack Overflow用户
提问于 2015-09-19 01:29:20
回答 1查看 712关注 0票数 7

使用Roslyn,我将基于从我无法控制的代码中解析的方法符号生成C#代码。因此,该方法可以有任意数量的参数。我生成的代码包括一个接受单个参数的lambda表达式,如:

代码语言:javascript
代码运行次数:0
运行
复制
// I'm generating code like this
public void SomeMethod()
{
    DoSomething(x => x.Foo());
}

此代码的一个潜在问题是,包含方法是否包含一个名为x的参数。

代码语言:javascript
代码运行次数:0
运行
复制
// my code generator might produce this
public void SomeMethod(int x)
{
    DoSomething(x => x.Foo());
}

此代码将导致错误:

不能在此作用域中声明名为“x”的本地或参数,因为该名称在封闭的本地作用域中用于定义本地或参数。

当然可以。

为了解决这个问题,我想我可以从标识符名x开始,使用SemanticModel.LookupSymbols来查看它是否已经定义了。如果是这样的话,则使用_ (获取_x)并重复。

但这是最好的方法吗?如果是这样的话,当我只有一个方法符号时,我如何使用LookupSymbols呢?

我想到的另一个选项是只在方法符号中使用Parameters集合。我可以对它们执行相同的名称选择算法。但这样就足够了吗?例如:

代码语言:javascript
代码运行次数:0
运行
复制
private static string GetIdentifierName(IMethodSymbol within)
{
    var proposed = "x";

    while (within.Parameters.Any(x => x.Name == proposed))
    {
        proposed = "_" + proposed;
    }

    return proposed;
}
EN

回答 1

Stack Overflow用户

发布于 2015-10-29 14:24:30

使用SemanticModel.LookupSymbols似乎是一种不错的方法。这就是Visual将选定的代码移动到新方法的方式。查看罗斯林中的UniqueNameGenerator内部类。

至于如何使用LookupSymbols,您所拥有的只是一个方法符号:您已经将生成的DoSomething(x => x.Foo());添加到代码中,所以您拥有的不仅仅是一个方法符号,不是吗?但是在任何情况下,您都可以从IMethodSymbol获得DeclaringSyntaxReferences来访问相应的语法节点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32663184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档