1

给定 WPF 窗口的 INamedTypeSymbol,我似乎无法为在 XAML 中定义的成员获取 ISymbol(然后编译为自动生成的 .g.cs 文件的一部分)。

为了重现我遇到的问题,

  1. 在 Visual Studio 中创建一个新的空白 WPF 应用程序
  2. 添加<TextBlock Name="tb1"/>到 MainWindow.xaml
  3. 将以下代码放入 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

4

0 回答 0