Я это сделаю используйте пример на основе Enum, поскольку они распространены. Дано (упрощено для ясности):
Код: Выделить всё
public void Initialize(IncrementalGeneratorInitializationContext context)
{
IncrementalValuesProvider sources = context.SyntaxProvider
.ForAttributeWithMetadataName(
MyEnumAttributeFullName,
predicate: (node, _) => node is EnumDeclarationSyntax,
transform: MyTransform)
.WithTrackingName("Gathering")
.Where(static node => node is not null)
.WithTrackingName("RemovingNulls");
context.RegisterSourceOutput(sources, static (context, sources) => Execute(context, in sources));
}
Мой вопрос: как Могу ли я создать/зарегистрировать исходный файл на основе ВСЕХ сгенерированных MyEnumData (а не по одному)? Я ищу эффективное решение во время компиляции, которое не требует отражения во время выполнения.
По сути, я ищу эквивалент:
Код: Выделить всё
public void RegisterSourceOutput(IncrementalValuesProvider source, Action action)
Это можно использовать для компиляции компиляции. реестры времени, которые позволяют избежать отражения во время выполнения. В этом примере перечислений это можно использовать для создания реестра всех перечислений, помеченных MyEnumAttributeFullName.
Моей первой мыслью было как-то вручную создать/заполнить это:
Код: Выделить всё
IncrementalValuesProvider = ???
РЕДАКТИРОВАТЬ: Хотя на этот вопрос был дан ответ, мне пришло в голову, что если вы создаете источники для нескольких проекты и хотите создать реестр, сгенерированный исходным кодом, в основном приложении, это, вероятно, должны быть два отдельных генератора, которые (по определению) не могут зависеть от результатов друг друга.
Подробнее здесь: https://stackoverflow.com/questions/784 ... all-transf