Как получить значение вложенного класса - PullRequest
0 голосов
/ 30 мая 2018

Я работаю над следующей проблемой:

    public class Unity
    {
        public Article Article {get;set;}
        public string Text{get;set;}
        public string Description{get;set;}
        public int NumberOfPages{get;set;}
    }
enter code here
    public class Article
    {
        public int Id{get;set;}
        public string Name{get;set;}
        public Category SubCategory {get;set;}
        public Model Model {get;set}

        public string override ToString(){
             return Name;
        }
    }
    public class Category
    {
        public int Id{get;set;}
        public string Name{get;set;}
        public Category CategoryFather { get;set;}
    }
    public class Model{
        public int Id {get;set;}
        public string Name{get;set;}
        public Model ModelFather{get;set;}
    }

Представьте, что у меня есть этот домен, я хотел бы скопировать Name из Article, который я делаю, но мне нужно изСтатья Name из Model и Name из Category.

У меня есть следующий код для копирования:

public static List<DataPropertyReport> GetPrimitiveProperties<T>(T entity)
        {
            var properties = entity.GetType().GetProperties();

            List<DataPropertyReport> info = new List<DataPropertyReport>();

            foreach (var property in properties)
            {
                Object value = property.GetValue(entity, null);

                    var name = property.Name;
                    info.Add(new DataPropertyReport(name, value!=null?value.ToString():"", 1));    
            }

            return info;
        }

1 Ответ

0 голосов
/ 30 мая 2018

Как уже упоминалось вендеттамит, вы можете достичь с помощью рекурсии.Приведенный ниже код обеспечивает базовую реализацию для примитивов типа и класса данных.Вы должны обрабатывать различные потоки кода в зависимости от структуры вашего объекта.

    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}";
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...