C# 使用Roslyn确定唯一标识符名称

C# 使用Roslyn确定唯一标识符名称,c#,.net,code-generation,roslyn,C#,.net,Code Generation,Roslyn,使用Roslyn,我基于从我无法控制的代码中解析出来的方法符号生成C#代码。因此,该方法可以有任意数量的参数。我生成的代码包含一个lambda表达式,该表达式接受一个参数,例如: // I'm generating code like this public void SomeMethod() { DoSomething(x => x.Foo()); } 此代码的一个潜在问题是,如果包含的方法包含一个名为x的参数: // my code generator might produ

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

// I'm generating code like this
public void SomeMethod()
{
    DoSomething(x => x.Foo());
}
此代码的一个潜在问题是,如果包含的方法包含一个名为
x
的参数:

// my code generator might produce this
public void SomeMethod(int x)
{
    DoSomething(x => x.Foo());
}
此代码导致错误:

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

很公平

为了解决这个问题,我想我可以从标识符名
x
开始,使用
SemanticModel.LookupSymbols
查看它是否已经定义。如果是这样,请预先结束
\uu
(以获取
\ux
)并重复

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

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

private static string GetIdentifierName(IMethodSymbol within)
{
    var proposed = "x";

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

    return proposed;
}

使用
SemanticModel.LookupSymbols
似乎是一个很好的方法。这是VisualStudio将选定代码移动到新方法的方式。查看Roslyn的内部类


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

当我必须根据方法参数标识符进行验证时,我也使用了第二种方法。您还需要检查局部变量。@Slaks:我正在生成方法,因此我可以控制局部变量(没有)。