Код: Выделить всё
// user-code
[MarkerAttribute(ConfigFlags.Option1 | ConfigFlags.Option2)]
public class MyClass { }
Я добавляю определение ConfigFlags в компиляцию с помощью RegisterPostInitializationOutput , что означает, что я не могу полагаться на ExtraTextsProvider.
Я могу использовать отражение для чтения каждого члена перечисления из определения генератора:
Код: Выделить всё
(ConfigFlags[])Enum.GetValues(typeof(ConfigFlags));
Проблема этого подхода заключается в том, что я не могу добавить встроенный XML документация к определению ConfigFlags генератора:
Код: Выделить всё
[Flags]
internal enum ConfigFlags
{
/// Option 1
Option1,
/// Option 2
Option2
}
Я хотел бы сделать следующее:
Код: Выделить всё
var sb = new StringBuilder("// ").AppendLine();
do
{
var path = Path.Combine
(
Path.GetDirectoryName(typeof(ConfigFlags).Assembly.Location),
"../../../ConfigFlags.cs"
);
try
{
using var reader = new StreamReader(path);
_ = sb.Append(reader.ReadToEnd());
break;
}
catch (FileNotFoundException) { }
} while (true);
return sb.ToString();
Это работает, но это просто обходит правило против операций файлового ввода-вывода.
Я приветствую предложения по копированию содержимого исходного файла (например, File.ReadAllText()) из проекта генератора в компиляция пользовательского кода с помощью RegisterPostInitializationOutput, которая не зависит от файлового ввода-вывода.
Подробнее здесь: https://stackoverflow.com/questions/789 ... registerpo
Мобильная версия