给定 WPF 窗口的 INamedTypeSymbol,我似乎无法为在 XAML 中定义的成员获取 ISymbol(然后编译为自动生成的 .g.cs 文件的一部分)。
为了重现我遇到的问题,
- 在 Visual Studio 中创建一个新的空白 WPF 应用程序
- 添加
<TextBlock Name="tb1"/>
到 MainWindow.xaml - 将以下代码放入 MainWindow.xaml.cs 方法并调用它:
private async void Compile()
{
var workspace = MSBuildWorkspace.Create();
workspace.LoadMetadataForReferencedProjects = true;
var solution = await workspace.OpenSolutionAsync(@"..\..\WpfApp1.Sln");
var project = solution.Projects.Single();
// this doesn't help
project = project.WithCompilationOptions(project.CompilationOptions.WithMetadataImportOptions(MetadataImportOptions.All));
var comp = await project.GetCompilationAsync();
INamedTypeSymbol mainWindow = comp.GetTypeByMetadataName(GetType().FullName);
var members = mainWindow.GetMembers();
Debug.Assert(members.Any(m => m.Name == nameof(tb1)));
}
如您所见,断言失败,我似乎找不到代表“tb1”成员字段的 ISymbol。
members.Length == 2; // true
members[0].Name == ".ctor" // true
members[1].Name == "Compile" // true
我怎样才能得到 tb1而不求助于设置?x:FieldModifier="public"
TextBlock