#c# #reflection #roslyn
#c# #отражение #рослин
Вопрос:
У меня есть классы, которые задают жестко заданные значения. Пример выглядит следующим образом:
[CodeGenAsValueObject]
public class DfltTaxableTypes : WithEnumerablePropsOfType<TaxableType>
{
public static TaxableType Taxable = new TaxableType()
{ // <- I want what's inside of here specifically as Dict<string, object>
TaxableTypeId = new Guid("7a702ec4-94a3-431b-8217-2b44ef0ae22a"),
Name = "Taxable"
}; // <- To here
public static TaxableType NonTaxable = new TaxableType()
{
TaxableTypeId = new Guid("76eee771-cbdc-4a7b-95d5-0d6e0959bdff"),
Name = "NonTaxable"
};
}
Предположение TaxableType
имеет много свойств, которые в противном случае меня не волнуют.
Как я могу с помощью отражения получить что-то вроде Dictionary<string, object>
назначенных свойств для каждого статического TaxableType
?
Я использую это в пользовательской генерации кода для наших клиентов Typescript, поэтому производительность не является проблемой.
Что у меня есть для начала:
var dfltValObjContainers = myAssy.GetTypes()
.Where(x => x.CustomAttributes.Select(y => y.AttributeType)
.ToList()
.Contains(typeof(CodeGenAsValueObject)))
.Distinct().ToList();
var containerInstances= dfltValObjContainers.Select(x => {
var instance = Activator.CreateInstance(x);
// Could get all Fields' values where value != default(fieldType)..
// Would prefer a more direct get assigned properties of object initializer.
var eaValueObj = x.GetFields().Select(f => {
return f.GetObjectInitializersAsDict() // <- Need help here.
}).ToList();
}).ToList();
Комментарии:
1. Одно (частичное) предложение состоит в том, чтобы сравнить значение каждого свойства со значением по умолчанию для этого свойства, предполагая, что вы не инициализируете его значением по умолчанию.
2. @Paramecium13 — да, это мой запасной вариант, если я не получу лучшего ответа.. Записал это в комментариях к тому, что я начал.
3. Вы также можете попытаться отразить статическую конструкцию класса, я думаю, именно там будет код инициализации, и найти, какие свойства вы устанавливаете для каких объектов. Однако это потребует синтаксического анализа IL.
4. Вы пытаетесь реализовать пользовательские перечисления на основе классов? Вы хотите иметь возможность получить словарь всех свойств, определенных в вашем TaxableType? Я предполагаю, что словарь будет содержать строковый ключ имени свойства с объектом, представляющим значение указанного свойства? Ваш
TaxableType
класс является абстрактным классом или это конкретный класс? Вы хотите получить только свойства, определенные вTaxableType
классе, или вы хотите также получить какие-либо свойства, определенные в производных классах? Много вопросов, но я просто пытаюсь убедиться, что я правильно понимаю.5. Это долгий путь, но если вы нацелены на .NET 5, вы можете использовать source generator, а затем подключиться к
InitializerExpressionSyntax
.