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

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

Сообщение Anonymous »

Я пытаюсь написать набор исходных генераторов для генерации заводских классов в приложении Blazor. < /p>
Более старые примеры - все используют isourcegenerator < /code>, которые, как я считаю, были заменены
IIncrementalGenerator.
Единственный хороший пример, который я могу найти, - это Enumgenerator (входит в какие -либо детали, помимо многих постов, которые отрывают одни и те же банальные и бесполезные примеры).
То, что я хочу, - это найти все классы, которые реализуют интерфейс, вытащили из них некоторую информацию (может быть, на основе класса атрибут, если я не могу извлечь его в другой путь) и тогда надумать. Старые примеры используют контекст.[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#»