C# 通过反射获取类字段名和值并加入到字典中(包含递归获取)
//测试类
public class HKAddvisitor1
{
public string code { set; get; }
public string msg { set; get; }
public string data { set; get; }
}
//调用
HKAddvisitor1 hKAddvisitor1 = new HKAddvisitor1()
{
code = "1",
data = "2",
msg = "搞定",
};
GetFields(hKAddvisitor1);
//基础方法
Dictionary<string, string> GetFields<T>(T t)
{
Dictionary<string, string> fields = new Dictionary<string, string>();
var type = t.GetType().GetProperties();
foreach (PropertyInfo item in type)
{
var typeName = item.PropertyType.Name;
if (typeName == "Nullable`1")
{
typeName = item.PropertyType.GenericTypeArguments.FirstOrDefault().Name;
}
Console.WriteLine("{0}-->{1}", item.Name, item.GetValue(t));
}
return fields;
}
//递归测试类
public class HKAddvisitor1
{
public string sucode { set; get; }
public string sumsg { set; get; }
public string sudata { set; get; }
}
public class HKAddvisitor
{
public string code { set; get; }
public string msg { set; get; }
public HKAddvisitor1 data { set; get; }
}
//递归调用
HKAddvisitor hKAddvisitor = new HKAddvisitor()
{
code = "1",
msg = "搞定",
data = new HKAddvisitor1
{
sucode = "2",
sumsg = "heheh",
sudata = "dsa"
}
};
Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
GetInfoPropertys(hKAddvisitor, keyValuePairs);
foreach (var item in keyValuePairs)
{
Console.WriteLine("属性名:{0},属性值:{1}", item.Key, item.Value);
}
//递归获取
void GetInfoPropertys(object objInfo, Dictionary<string, string> keyValuePairs)
{
StringBuilder strB = new System.Text.StringBuilder();
if (objInfo == null) return;
Type tInfo = objInfo.GetType();
PropertyInfo[] pInfos = tInfo.GetProperties();
if (tInfo.IsGenericType)
{
System.Collections.ICollection Ilist = objInfo as System.Collections.ICollection;
if (Ilist != null)
{
strB.AppendFormat("集合⼦属性{0}<br/>", Ilist.Count);
foreach (object obj in Ilist)
{
GetInfoPropertys(obj, keyValuePairs);
}
}
else
{
strB.Append("泛型集合为空<br/>");
}
return;
}
foreach (PropertyInfo pTemp in pInfos)
{
string Pname = pTemp.Name;
string pTypeName = pTemp.PropertyType.Name;
object Pvalue = pTemp.GetValue(objInfo, null);
if (pTemp.PropertyType.IsValueType || pTemp.PropertyType.Name.StartsWith("String"))
{
string value = (Pvalue == null ? "" : Pvalue.ToString());
keyValuePairs.Add(Pname, value);
Console.WriteLine("属性名:{0},属性类型:{1},属性值:{2}<br/>", Pname, pTypeName, value);
strB.AppendFormat("属性名:{0},属性类型:{1},属性值:{2}<br/>", Pname, pTypeName, value);
}
else
{
//string value = Pvalue == null ? "" : Pvalue.ToString();
//Console.WriteLine("<br/><b>⼦类</b>,属性名:{0},属性类型:{1},属性值:{2}<br/>", Pname, pTypeName, value);
//strB.AppendFormat("<br/><b>⼦类</b>,属性名:{0},属性类型:{1},属性值:{2}<br/>", Pname, pTypeName, value);
//keyValuePairs.Add(Pname, value);
//strB.Append("----------------------------------------------<br/>");
GetInfoPropertys(Pvalue, keyValuePairs);
}
}
}
//拓展
https://www.cnblogs.com/bmyblogs/p/9346843.html (判断属性类型)
https://wenku.baidu.com/view/6b904c485bfafab069dc5022aaea998fcc2240e4.html (递归)
C# 通过反射获取类字段名和值并加入到字典中(包含递归获取)的更多相关文章
- 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...
- java对象的内存布局(二):利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值
在上一篇文章中.我们列出了计算java对象大小的几个结论以及jol工具的使用,jol工具的源代码有兴趣的能够去看下.如今我们利用JDK中的sun.misc.Unsafe来计算下字段的偏移地址,一则验证 ...
- AutoCad2012新增类AcRxVariablesDictionary 可以获取所有变量名和值
//AutoCad2012新增类 获取所有变量名和值 AcRxVariablesDictionary *dic=AcRxVariablesDictionary::get(); const AcArra ...
- mybaitis查询 (数据库与实体类字段名不相同)
1.这是我的数据库字段名和实体类字段名 2.方法 方法一: 查询的结果标题 会跟实体类的属性一一匹配,一定要一致就算数据库字段和属性不一致,我们可以把查询结果设置一个别名,让别名=属性名 方法二:使用 ...
- mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)字符串拼接cancat实战例子
mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)mysql字符串拼接cancat实战例子: mysql update set 多个字段相加,如果是数字相加可以直接用+号(注:hund ...
- C# array与arraylist区别及获取sql字段名
array与arraylist的区别: 1. Array 的容量是固定的,而 ArrayList 的容量是根据需要自动扩展的.如果更改了 ArrayList.Capacity 属性的值,则自动进行内 ...
- C#获取实体类属性名和值
遍历获得一个实体类的所有属性名,以及该类的所有属性的值 //先定义一个类: public class User { public string name { get; set; } public st ...
- Oracle获取表字段名,字段类型,字段长度,注释
SELECT b.comments as 注释, a.column_name as 列名, a.data_type || '(' || a.data_length || ')' as 数据类型, a. ...
- 使用mysql关键字做类字段名报的错,花了我一个钟,坑啊
com.modelsystem.po.ProjectPlan@701faaedHibernate: insert into ld.project_plan (addTime, describe, ex ...
- java 反射获取类的静态属性值
public class AppTest { private NodeClass nodeClass; public static String hehe = "hehe"; pu ...
随机推荐
- SQL注入绕waf思路总结
1.关键字大小写混合绕过 关键字大小写混合只针对于小写或大写的关键字匹配技术-正则表达式,如果在匹配时大小写不敏感的话,就无法绕过.这是最简单的一个绕过技术. 例如:将union select混写成U ...
- 用excel表画一个乐高
一.背景:在商场看到一个超级玛丽的乐高图感觉使用excel的颜色填充也能画出来,并且可以借助python来实现 二.excel表如何绘制正方形:1.统一设置行高与列宽excel表单元格的行与列的默认计 ...
- Qt自带的阴影类、跨线程问题汇总、hover相关、全屏轮子,一些思考。
一点思考:故事的结局重不重要? 我语文不好,但是我数学不好. 我数学不好,但是我英语不好. 我英语不好,但是我物理不好. 我物理不好,但是我化学不好. 我化学不好,但是我历史不好. 我历史不好,但是我 ...
- LeetCode HOT 100:最大子数组和
题目:53. 最大子数组和 题目描述: 给你一个整数数组,在该数组的所有子数组中,找到一个子数组中所有元素相加和最大,返回这个最大的和.子数组就是一个数组中,由一个或几个下标连续的元素,组成的小数组, ...
- DPDK编译与演示
环境 安装dpdk 安装依赖 环境配置 编译 遇到过的问题 dpdk使用 设置hugepage helloworld演示 遇到问题 timer演示 环境 虚拟机系统:ubuntu:1404 安装dpd ...
- ArcGIS Python判断数据是否存在
判断是程序编写的一个基本的操作,也是增强程序稳定性的重要方式.在ArcPy处理数据时,要保证数据存在才能做后续的操作,为源GIS提示使用arcpy自带的Exists函数可判断要素类.表.数据集.sha ...
- 【题解】[LNOI2022] 盒
题目分析: 我们可以对每一条边单独计算贡献,这样会发现贡献很好算: \[ans = \sum_{i=0}^{n-1} w_i \sum_{j=0}^S |j - s_i| \binom{i+j-1}{ ...
- 1、Spring源码环境搭建
本文目的 完成Spring Framework5.x的源码构建 准备 官网:Spring Framework 使用5.x版本源码包构建 项目管理工具 gradle(没学过的先去找资料学习) 说明 Sp ...
- 连接KingbaseES异常,致命错误/ 用户"system" Password 认证失败(kbjdbc/autodetected server-encoding to be GB2312...)
com.kingbase8.util.KSQLException: 致命错误: 用户"system" Password 认证失败(kbjdbc:autodetected serve ...
- 一把梭:REST API 全用 POST(转载)
一把梭:REST API 全用 POST(转载) 原文链接: https://coolshell.cn/articles/22173.html 写这篇文章的原因主要还是因为V2EX上的这个贴子,这个贴 ...