Используя отражение, вы можете рекурсивно заполнять ваши объекты и устанавливать любые значения по умолчанию, которые вы выберете.Небольшой пример вспомогательной функции, которая может сделать это за вас:
void SetDefaults(object testObj)
{
var props = testObj.GetType().GetProperties();
foreach (var prop in props)
{
if (prop.GetSetMethod() == null)
{
continue;
}
var propType = prop.PropertyType;
if (propType == typeof(int))
{
prop.SetValue(testObj, 1);
}
else if (propType == typeof(bool))
{
prop.SetValue(testObj, false);
}
// More conditions...
else
{
var ctor = propType.GetConstructor(Type.EmptyTypes);
var propertyObject = ctor.Invoke(new object[0]);
SetDefaults(propertyObject);
prop.SetValue(testObj, propertyObject);
}
}
}
Как вы можете видеть, если ваше дерево объектов использует типы, которые не имеют конструкторов по умолчанию (конструкторы без параметров), вам нужно еще немногосложная логика в else
-условии.По сути дела, здесь происходит очень упрощенная версия того, что происходит в среде внедрения зависимостей.
Чтобы использовать это, сделайте что-то вроде:
void Main()
{
TestObject obj = new TestObject();
SetDefaults(obj);
Console.WriteLine(obj);
}
class TestObject {
public int MyInt { get; set; }
public SubTestObject SubObj { get; set; }
}
class SubTestObject {
public int MyOwnInt { get; set; }
public bool MyBoolGetter => 1 > 0;
}