Я хочу создать небольшой инструмент тестирования для моей программы, который заполняет все свойства случайного объекта (неизвестный тип во время компиляции). Пример структуры:
public class HeadObject
{
public Company Company { get; set; }
public CompanyAddress CompanyAddress { get; set; }
public List<Details> Details{ get; set; }
public ApplicationUser AppUser { get; set; }
}
и, например, класс Company будет выглядеть следующим образом:
public class Company
{
public string CompanyName{ get; set; }
public string PhoneNumber{ get; set; }
public Address Adress{ get; set; }
public int CompanyNo{ get; set; }
public List<Employee> Employees{ get; set; }
}
это довольно упрощенно, потому что в каждом HeadOjbect есть около 30 свойств, которые могут содержать подчиненные свойства или свойство может быть списком и т. д. c .. Мне нужно заполнить ~ 30 объектов HeadObjects во время выполнения. Я уже пробовал это с различными библиотеками, такими как GenFu , nBuilder или Bogus .
Последние 2 имеют проблему с тем, что я должен заполнить свойства самостоятельно, только данные генерируются. Похоже, что GenFu может работать только с такими примитивными свойствами, как int, string, ... И если вы представляете HeadObject как root дерева, то будет
~ 300 узлов на дерево
Высота дерева: от 1 до 7 (!)
~ 30 Различных деревьев (HeadObjects)
, поэтому потребовались бы дни, чтобы записать все это самостоятельно, и обслуживание потребовало бы быть болью.
Я ценю любую идею.
ОБНОВЛЕНИЕ
Спасибо за ваши ответы! Как я могу инициализировать объекты? например, я получаю свойство Company моего головного объекта, а затем хочу инициализировать его, чтобы иметь возможность его заполнить. Мой метод (его рекурсивный) начинается так:
private static T FillAllProperties<T>(T masterObject) where T : new()
{
try
{
Type masterType = masterObject.GetType();
T headObject = new T();
......IF primitive Type fill it and return the value
otherwise get Properties into firstProperties.......
foreach (var propertyInfo in firstProperties)
{
var objectInstance = FillAllProperties(propertyInfo.PropertyType);
headObject.GetType().GetProperty($"{propertyInfo.Name}").SetValue(headObject, objectInstance, null);
}
Теперь у меня есть 2 вопроса:
- Мой способ инициализации типа c generi правильный?
- при рекурсивном вызове я получаю следующую ошибку: "Тип 'System.Type' должен иметь конструктор publi c без параметров, чтобы использовать его в качестве параметра 'T' ....
Возможно, мне нужна еще одна "конструкция" для этого алгоритма, но как ..?