Roslyn - 用完全限定名称替换所有名称
Roslyn - replace all names by full qualified name
如何用完整的限定名称替换一段 C# 代码中的所有名称?目的是用限定名称替换所有 usings。
我知道使用别名声明可能会很棘手,但在我们的情况下并非如此。
根据您的需要,您可以将此作为 CodeFixProvider
或 SyntaxRewriter
实施。无论如何,请从这里开始:https://joshvarty.wordpress.com/2014/08/15/learn-roslyn-now-part-5-csharpsyntaxrewriter/
除了上下文,您很可能需要处理 InvocationExpressionSyntax
个节点,这些节点的符号是 IMethodSymbol
并且 ReducedExtension
作为方法类型:
var inv = (InvocationExpressionSyntax)node;
var symbol = semanticModel.GetSymbolInfo(inv).Symbol as IMethodSymbol;
if (symbol.MethodKind == MethodKind.ReducedExtension)
{
...
}
然后您需要将 InvocationExpressionSyntax
重写为另一个。这个站点对重写有很大帮助:https://roslynquoter.azurewebsites.net/。您可以通过调用 ToDisplayString()
或 ToDisplayParts()
来获取方法包含类型的全名。
此外,您需要将第一个参数传递给新的调用,因此您需要获取调用调用的表达式:((MemberAccessExpressionSyntax)inv.Expression).Expression
。
您可以按照这些思路开始,如果遇到困难,您可以回到 SO 并提出适当的问题。
如何用完整的限定名称替换一段 C# 代码中的所有名称?目的是用限定名称替换所有 usings。 我知道使用别名声明可能会很棘手,但在我们的情况下并非如此。
根据您的需要,您可以将此作为 CodeFixProvider
或 SyntaxRewriter
实施。无论如何,请从这里开始:https://joshvarty.wordpress.com/2014/08/15/learn-roslyn-now-part-5-csharpsyntaxrewriter/
除了上下文,您很可能需要处理 InvocationExpressionSyntax
个节点,这些节点的符号是 IMethodSymbol
并且 ReducedExtension
作为方法类型:
var inv = (InvocationExpressionSyntax)node;
var symbol = semanticModel.GetSymbolInfo(inv).Symbol as IMethodSymbol;
if (symbol.MethodKind == MethodKind.ReducedExtension)
{
...
}
然后您需要将 InvocationExpressionSyntax
重写为另一个。这个站点对重写有很大帮助:https://roslynquoter.azurewebsites.net/。您可以通过调用 ToDisplayString()
或 ToDisplayParts()
来获取方法包含类型的全名。
此外,您需要将第一个参数传递给新的调用,因此您需要获取调用调用的表达式:((MemberAccessExpressionSyntax)inv.Expression).Expression
。
您可以按照这些思路开始,如果遇到困难,您可以回到 SO 并提出适当的问题。