Я пытаюсь написать набор генераторов исходного кода для создания фабричных классов в приложении Blazor.
Все старые примеры используют ISourceGenerator, который, как мне кажется, был заменен автор
IIncrementalGenerator.
Единственный хороший пример, который я могу найти, - это EnumGenerator (рассказывает все детали, помимо множества сообщений, которые повторяют одни и те же банальные и бесполезные примеры).Я хочу найти все классы, реализующие интерфейс, извлечь из них некоторую информацию (возможно, атрибут на основе класса, если я не могу извлечь ее другим способом), а затем сгенерировать фабричный класс. В старых примерах используется context.Compilation.SyntaxTrees, но этот подход устарел.
Вот пример кода:
[Generator]
public class MySourceGenerator : IIncrementalGenerator
{
public readonly record struct PresentationFactoryToGenerate
{
public readonly string Name;
public readonly string Id;
public readonly string Editor;
public PresentationFactoryToGenerate(string name, string editor, string id)
{
this.Name = name;
this.Editor = editor;
this.Id = id;
}
}
public void Initialize(IncrementalGeneratorInitializationContext context)
{
Debugger.Launch();
var presenters = Enumerable.Empty();
// STUCK HERE
// Get the list of presenters implementing IEditPresenter
foreach (var presenter in presenters)
context.RegisterPostInitializationOutput(ctx => ctx.AddSource($"{presenter.Name}EditPresenterFactory.g", SourceText.From(BuildPresenterFactory(presenter), Encoding.UTF8)));
}
private string BuildPresenterFactory(PresentationFactoryToGenerate item)
{
var code = $$"""
namespace Blazr.App.Presentation;
public class {{item.Name}}EditPresenterFactory
{
private readonly IServiceProvider _serviceProvider;
public {{item.Name}}EditPresenterFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public async ValueTask GetPresenterAsync({{item.Id}} id)
{
var presenter = ActivatorUtilities.CreateInstance(_serviceProvider);
ArgumentNullException.ThrowIfNull(presenter);
await presenter.LoadAsync(id);
return presenter;
}
}
""";
return code;
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... ace-in-the
Как получить классы в генераторе исходного кода, которые реализуют, скажем, интерфейс в целевом проекте ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение