Невозможно получить элементы XAML Control через Roslyn Compilation

Учитывая INamedTypeSymbol окна WPF, я не могу получить ISymbol для членов, которые определены в XAML (и затем компилируются как часть автоматически сгенерированного файла .g.cs).

Чтобы воспроизвести проблему, с которой я сталкиваюсь,

  1. Создайте новое пустое приложение WPF в Visual Studio.
  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)));
}

Как видите, утверждение не выполняется, и я не могу найти ISymbol, представляющий поле-член "tb1".

      members.Length  == 2;        // true
members[0].Name == ".ctor"   // true
members[1].Name == "Compile" // true

Как я могу получить tb1, не прибегая к настройке x:FieldModifier="public" на TextBlock?

0 ответов

Другие вопросы по тегам