Как уже упоминалось вендеттамит, вы можете достичь с помощью рекурсии.Приведенный ниже код обеспечивает базовую реализацию для примитивов типа и класса данных.Вы должны обрабатывать различные потоки кода в зависимости от структуры вашего объекта.
public static List<DataPropertyReport> GetPrimitiveProperties<T>(T entity, string heirarchyName = null)
{
List<DataPropertyReport> info = new List<DataPropertyReport>();
if (entity != null)
{
var properties = entity.GetType().GetProperties();
foreach (var property in properties)
{
Object value = property.GetValue(entity, null);
var name = property.Name;
var relatedHeirarchyName = string.IsNullOrEmpty(heirarchyName) ? name : string.Concat(heirarchyName, ".", name);
if (property.PropertyType != typeof(string) && property.PropertyType.IsClass)
{
var reports = GetPrimitiveProperties(value, relatedHeirarchyName);
info.AddRange(reports);
}
else
{
info.Add(new DataPropertyReport(relatedHeirarchyName, value != null ? value.ToString() : "", 1));
}
}
}
return info;
}
Для объекта ниже
Unity unity = new Unity()
{
NumberOfPages = 1,
Description = "Test Des",
Text = "Test Text",
Article = new Article()
{
Id = 1,
Name = "test Article",
Model = new Model()
{
Name = "Test Model",
Id = 2,
ModelFather = new Model()
{
Id = 3,
Name = "Test Father Model"
}
},
SubCategory = new Category()
{
Name = "Test Category",
Id = 4,
CategoryFather = new Category()
{
Id = 5,
Name = "Test Category Fathere"
}
}
}
};
Вывод:
Имя: Статья.Значение идентификатора: 1
Имя: Article.Name Значение: тестовая статья
Имя: Article.SubCategory.Id Значение: 4
Имя: Article.SubCategory.Name Значение:Категория теста
Имя: Article.SubCategory.CategoryFather.Id Значение: 5
Имя: Article.SubCategory.CategoryFather.Name Значение: Тестовая категория Fathere
Имя: Статья.Значение Model.Id: 2
Имя: Article.Model.Name Значение: тестовая модель
Имя: Article.Model.ModelFather.Id Значение: 3
Имя: статья.Model.ModelFather.Name Значение: тестовый отец Модель
Имя: текстовое значение: тестовый текст
Имя: Описание Значение: тестовый дес
Имя: NumberOfPages Значение: 1
На основе приведенной ниже реализации ToString DataPropertyReport
public override string ToString()
{
return $"Name : {this.Name} Value : {this.Value}";
}