gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:38:55 30 4
gpt4 key购买 nike

使用 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());
}

此代码导致错误:

A local or parameter named 'x' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter

很公平。

为了解决这个问题,我想我可以从标识符名称 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;
}

最佳答案

使用 SemanticModel.LookupSymbols 似乎是一个不错的方法。这是 Visual Studio 将选定代码移动到新方法的方式。查看UniqueNameGenerator Roslyn 中的内部类。

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

关于c# - 使用 Roslyn 确定唯一标识符名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32663184/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com