C# 使用Roslyn确定唯一标识符名称
使用Roslyn,我基于从我无法控制的代码中解析出来的方法符号生成C#代码。因此,该方法可以有任意数量的参数。我生成的代码包含一个lambda表达式,该表达式接受一个参数,例如: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
// 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:我正在生成方法,因此我可以控制局部变量(没有)。