使用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
来查看它是否已经定义了。如果是这样的话,则使用_
(获取_x
)并重复。
但这是最好的方法吗?如果是这样的话,当我只有一个方法符号时,我如何使用LookupSymbols
呢?
我想到的另一个选项是只在方法符号中使用Parameters
集合。我可以对它们执行相同的名称选择算法。但这样就足够了吗?例如:
private static string GetIdentifierName(IMethodSymbol within)
{
var proposed = "x";
while (within.Parameters.Any(x => x.Name == proposed))
{
proposed = "_" + proposed;
}
return proposed;
}
发布于 2015-10-29 06:24:30
使用SemanticModel.LookupSymbols
似乎是一种不错的方法。这就是Visual将选定的代码移动到新方法的方式。查看罗斯林中的UniqueNameGenerator
内部类。
至于如何使用LookupSymbols
,您所拥有的只是一个方法符号:您已经将生成的DoSomething(x => x.Foo());
添加到代码中,所以您拥有的不仅仅是一个方法符号,不是吗?但是在任何情况下,您都可以从IMethodSymbol
获得DeclaringSyntaxReferences
来访问相应的语法节点。
https://stackoverflow.com/questions/32663184
复制相似问题