C#-Roslyn:为什么字符串到MethodDeclarationSyntax的代码转换会出现异常
C#-Roslyn:Why the code conversion of the string to MethodDeclarationSyntax presents an exception
我的代码:
stringBuilder.AppendLine("}");
MethodDeclarationSyntax methodDeclaration = default;
var tmp = CSharpSyntaxTree.ParseText(stringBuilder.ToString())
.GetRoot()
.DescendantNodes();
var list = tmp.OfType<MemberDeclarationSyntax>();
foreach (var item in list)
{
Console.WriteLine(item.NormalizeWhitespace().ToFullString());
methodDeclaration = item as MethodDeclarationSyntax;
if (methodDeclaration != null)
break;
}
if (methodDeclaration is null)
throw new Exception("No create Roslyn ...");
return methodDeclaration;
字符串输出应该没有问题:
public void T1()
{
Console.WriteLine("666");
}
但是无法转换为MethodDeclarationSyntax,我该如何解决这个问题?
恐怕我可能会误解你想要达到的目标:
阅读您的代码,我假设您想找到第一个 method declared in a given SourceText.
您提供的 SourceText 不包含 MethodDeclarationSyntax!
CSharp代码
public void T1()
{
Console.WriteLine("666");
}
是一个GlobalStatementSyntax, containing a LocalFunctionStatementSyntax.
为了使 T1
成为 MethodDeclarationSyntax,您需要将其放入 Type 中,例如 class
、struct
或 interface
:
class C
{
public void T1()
{
Console.WriteLine("666");
}
}
但是,您的程序现在会在终止循环之前将整个 Class 和包含的方法打印到控制台,因为 SyntaxNodes are of type MemberDeclarationSyntax:
void T1()
是您期望的 MethodDeclarationSyntax 类型
class C
是 ClassDeclarationSyntax 类型,派生自 MemberDeclarationSyntax 因为它可以嵌套在另一个 class 中
我看到您正在使用 Visual Studio。在学习 Roslyn 和 CSharpSyntaxTree 时对我帮助很大的是(现在仍然是)Syntax Visualizer.
我的代码:
stringBuilder.AppendLine("}");
MethodDeclarationSyntax methodDeclaration = default;
var tmp = CSharpSyntaxTree.ParseText(stringBuilder.ToString())
.GetRoot()
.DescendantNodes();
var list = tmp.OfType<MemberDeclarationSyntax>();
foreach (var item in list)
{
Console.WriteLine(item.NormalizeWhitespace().ToFullString());
methodDeclaration = item as MethodDeclarationSyntax;
if (methodDeclaration != null)
break;
}
if (methodDeclaration is null)
throw new Exception("No create Roslyn ...");
return methodDeclaration;
字符串输出应该没有问题:
public void T1()
{
Console.WriteLine("666");
}
但是无法转换为MethodDeclarationSyntax,我该如何解决这个问题?
恐怕我可能会误解你想要达到的目标: 阅读您的代码,我假设您想找到第一个 method declared in a given SourceText.
您提供的 SourceText 不包含 MethodDeclarationSyntax!
CSharp代码
public void T1()
{
Console.WriteLine("666");
}
是一个GlobalStatementSyntax, containing a LocalFunctionStatementSyntax.
为了使 T1
成为 MethodDeclarationSyntax,您需要将其放入 Type 中,例如 class
、struct
或 interface
:
class C
{
public void T1()
{
Console.WriteLine("666");
}
}
但是,您的程序现在会在终止循环之前将整个 Class 和包含的方法打印到控制台,因为 SyntaxNodes are of type MemberDeclarationSyntax:
void T1()
是您期望的 MethodDeclarationSyntax 类型class C
是 ClassDeclarationSyntax 类型,派生自 MemberDeclarationSyntax 因为它可以嵌套在另一个 class 中
我看到您正在使用 Visual Studio。在学习 Roslyn 和 CSharpSyntaxTree 时对我帮助很大的是(现在仍然是)Syntax Visualizer.