C# 如何获取嵌套类的值

C# 如何获取嵌套类的值,c#,asp.net,entity-framework,linq,entity-framework-6,C#,Asp.net,Entity Framework,Linq,Entity Framework 6,我正在处理以下问题: 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 Artic

我正在处理以下问题:

    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;}
    }
假设我有这个域,我想复制
文章的
名称
,但我需要从文章中取出
模型的
名称
类别的
名称

我有下一个要复制的代码:

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;
        }
公共静态列表GetPrimitiveProperties(T实体) { var properties=entity.GetType().GetProperties(); 列表信息=新列表(); foreach(属性中的var属性) { 对象值=property.GetValue(实体,null); var name=property.name; 添加(新的DataPropertyReport(名称,值!=null?值.ToString():“”,1)); } 退货信息; }
正如vendettamit所提到的,您可以使用递归实现。下面的代码实现了原语的基本实现数据类型和类。您必须根据对象结构处理各种代码流

    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;
    }
输出是

名称:物品。Id值:1

名称:项目。名称值:测试项目

名称:Article.SubCategory.Id值:4

名称:Article.SubCategory.Name值:测试类别

名称:Article.SubCategory.CategoryFather.Id值:5

名称:Article.SubCategory.CategoryFather.Name值:Test Category Fathere

名称:Article.Model.Id值:2

名称:Article.Model.Name值:测试模型

名称:Article.Model.modeldfather.Id值:3

名称:Article.Model.modeldfather.Name值:测试父模型

名称:文本值:测试文本

名称:描述值:测试Des

名称:NumberOfPages值:1

基于下面对
DataPropertyReport

    public override string ToString()
    {
        return $"Name : {this.Name}   Value : {this.Value}";
    }

正如vendettamit所提到的,可以使用递归实现。下面的代码实现了原语的基本实现数据类型和类。您必须根据对象结构处理各种代码流

    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;
    }
输出是

名称:物品。Id值:1

名称:项目。名称值:测试项目

名称:Article.SubCategory.Id值:4

名称:Article.SubCategory.Name值:测试类别

名称:Article.SubCategory.CategoryFather.Id值:5

名称:Article.SubCategory.CategoryFather.Name值:Test Category Fathere

名称:Article.Model.Id值:2

名称:Article.Model.Name值:测试模型

名称:Article.Model.modeldfather.Id值:3

名称:Article.Model.modeldfather.Name值:测试父模型

名称:文本值:测试文本

名称:描述值:测试Des

名称:NumberOfPages值:1

基于下面对
DataPropertyReport

    public override string ToString()
    {
        return $"Name : {this.Name}   Value : {this.Value}";
    }

递归地。。!!你能再说一遍你的答案吗?因为在你回答之前,我一直在尝试递归地回答你的期望输出是什么,以及
DataPropertyReport
的结构是什么?@DanielAcevedo-发布了一个递归的答案,该答案也应该获取嵌套的类属性值。递归地。。!!你能再说一遍你的答案吗?因为在你回答之前,我一直在尝试递归,你期望的输出是什么,DataPropertyReport的结构是什么?@DanielAcevedo-发布了一个递归的答案,应该也能获取嵌套的类属性值。希望他永远不要试图跳过DateTime或Decimal。。。。否则,竖起大拇指。@MortenBork-谢谢。正如我在回答中提到的,已回答的代码具有基本的实现。因此必须处理其他场景,如DateTime、double(如您所述)、Nullable、Generic e.t.c。让我们希望他永远不要试图跳过DateTime或Decimal。。。。否则,竖起大拇指。@MortenBork-谢谢。正如我在回答中提到的,已回答的代码具有基本实现,因此必须处理其他场景,如DateTime、double(如您所述)、Nullable、Generic e.t.c。