Как получить классы в генераторе исходного кода, которые реализуют, скажем, интерфейс в целевом проектеC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как получить классы в генераторе исходного кода, которые реализуют, скажем, интерфейс в целевом проекте

Сообщение Anonymous »

Я пытаюсь написать набор генераторов исходного кода для создания фабричных классов в приложении 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»