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

时间:2015-09-19 01:29:21

标签: c# .net code-generation roslyn

使用Roslyn,我根据从我的控件之外的代码解析的方法符号生成C#代码。因此,该方法可以具有任意数量的参数。我生成的代码包含一个lambda表达式,它接受一个参数,例如:

step

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

x

此代码导致错误:

  

无法在此范围内声明名为“x”的本地或参数,因为该名称用于封闭的本地范围以定义本地或参数

足够公平。

为了解决这个问题,我想我可以从标识符名// my code generator might produce this public void SomeMethod(int x) { DoSomething(x => x.Foo()); } 开始,使用x来查看它是否已经定义。如果是,请添加SemanticModel.LookupSymbols(获取_)并重复。

但这是最好的方法吗?如果是这样,当我拥有的是方法符号时,如何使用_x

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

Parameters

1 个答案:

答案 0 :(得分:1)

使用SemanticModel.LookupSymbols似乎是一种很好的方法。这是Visual Studio将所选代码移动到新方法的方式。查看罗斯林的UniqueNameGenerator内部课程。

关于如何使用LookupSymbols当你拥有的只是一个方法符号时:你已经将生成的DoSomething(x => x.Foo());添加到代码中,所以你不仅仅是一个方法符号,不是吗? ?但无论如何,从IMethodSymbol开始,您可以DeclaringSyntaxReferences访问相应的语法节点。