使用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
答案 0 :(得分:1)
使用SemanticModel.LookupSymbols
似乎是一种很好的方法。这是Visual Studio将所选代码移动到新方法的方式。查看罗斯林的UniqueNameGenerator
内部课程。
关于如何使用LookupSymbols
当你拥有的只是一个方法符号时:你已经将生成的DoSomething(x => x.Foo());
添加到代码中,所以你不仅仅是一个方法符号,不是吗? ?但无论如何,从IMethodSymbol
开始,您可以DeclaringSyntaxReferences
访问相应的语法节点。