Невозможно получить элементы XAML Control через Roslyn Compilation
Учитывая INamedTypeSymbol окна WPF, я не могу получить ISymbol для членов, которые определены в XAML (и затем компилируются как часть автоматически сгенерированного файла .g.cs).
Чтобы воспроизвести проблему, с которой я сталкиваюсь,
- Создайте новое пустое приложение WPF в Visual Studio.
- Добавлять
<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)));
}
Как видите, утверждение не выполняется, и я не могу найти ISymbol, представляющий поле-член "tb1".
members.Length == 2; // true
members[0].Name == ".ctor" // true
members[1].Name == "Compile" // true
Как я могу получить tb1, не прибегая к настройке
x:FieldModifier="public"
на
TextBlock
?