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。