//测试类

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# 通过反射获取类字段名和值并加入到字典中(包含递归获取)的更多相关文章

  1. 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java

    import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...

  2. java对象的内存布局(二):利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值

    在上一篇文章中.我们列出了计算java对象大小的几个结论以及jol工具的使用,jol工具的源代码有兴趣的能够去看下.如今我们利用JDK中的sun.misc.Unsafe来计算下字段的偏移地址,一则验证 ...

  3. AutoCad2012新增类AcRxVariablesDictionary 可以获取所有变量名和值

    //AutoCad2012新增类 获取所有变量名和值 AcRxVariablesDictionary *dic=AcRxVariablesDictionary::get(); const AcArra ...

  4. mybaitis查询 (数据库与实体类字段名不相同)

    1.这是我的数据库字段名和实体类字段名 2.方法 方法一: 查询的结果标题 会跟实体类的属性一一匹配,一定要一致就算数据库字段和属性不一致,我们可以把查询结果设置一个别名,让别名=属性名 方法二:使用 ...

  5. mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)字符串拼接cancat实战例子

    mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)mysql字符串拼接cancat实战例子: mysql update set 多个字段相加,如果是数字相加可以直接用+号(注:hund ...

  6. C# array与arraylist区别及获取sql字段名

    array与arraylist的区别: 1.  Array 的容量是固定的,而 ArrayList 的容量是根据需要自动扩展的.如果更改了 ArrayList.Capacity 属性的值,则自动进行内 ...

  7. C#获取实体类属性名和值

    遍历获得一个实体类的所有属性名,以及该类的所有属性的值 //先定义一个类: public class User { public string name { get; set; } public st ...

  8. Oracle获取表字段名,字段类型,字段长度,注释

    SELECT b.comments as 注释, a.column_name as 列名, a.data_type || '(' || a.data_length || ')' as 数据类型, a. ...

  9. 使用mysql关键字做类字段名报的错,花了我一个钟,坑啊

    com.modelsystem.po.ProjectPlan@701faaedHibernate: insert into ld.project_plan (addTime, describe, ex ...

  10. java 反射获取类的静态属性值

    public class AppTest { private NodeClass nodeClass; public static String hehe = "hehe"; pu ...

随机推荐

  1. 【文档资料】Linux、Vi/Vim常用命令、文件夹和文件介绍

    一.Linux 1.系统信息[左1] 查看磁盘空间使用情况:df+参数 查看当前指定文件或目录的大小:du 查看不同硬件信息:cat/proc/xxx 查看系统和空闲内存:free +参数 SSH退出 ...

  2. intel Pin:动态二进制插桩的安装和使用,以及如何开发一个自己的Pintool

    先贴几个你可能用得上的链接 intel Pin的官方介绍Pin: Pin 3.21 User Guide (intel.com) intel Pin的API文档Pin: API Reference ( ...

  3. 像go 一样 打造.NET 单文件应用程序的编译器项目bflat 发布 7.0版本

    现代.NET和C#在低级/系统程序以及与C/C++/Rust等互操作方面的能力完全令各位刮目相看了,有人用C#开发的64位操作系统: GitHub - nifanfa/MOOS: C# x64 ope ...

  4. 制作 Python Docker 镜像的最佳实践

    概述 ️Reference: 制作容器镜像的最佳实践 这篇文章是关于制作 Python Docker 容器镜像的最佳实践.(2022 年 12 月更新) 最佳实践的目的一方面是为了减小镜像体积,提升 ...

  5. redis集合 实现 队列

    先说一下需求:用队列解决 流量削峰,主要应用场景:商城秒杀功能. 以下是业务流程图可以参考一下: 然后本地实现思路 截图下单页面 每次购买数量会减少1,设置了1000个库存,用户id 是随机生成的. ...

  6. C#多线程(四)并行编程篇之结构化

    前言 在前三章中我们的案例大量使用到了Thread这个类,通过其原始API,对其进行创建.启动.中断.中断.终止.取消以及异常处理,这样的写法不仅不够优雅(对接下来这篇,我称其为.NET现代化并行编程 ...

  7. Redis的数据持久化

    介绍 Redis 的数据持久化方案 Redis 的数据持久化主要有两大机制,AOF 日志和 RDB 快照. AOF 持久化是通过保存 Redis 服务器所执行的写命令来记录数据库状态. RDB 持久化 ...

  8. vivo 实时计算平台建设实践

    作者:vivo 互联网实时计算团队- Chen Tao 本文根据"2022 vivo开发者大会"现场演讲内容整理而成. vivo 实时计算平台是 vivo 实时团队基于 Apach ...

  9. Python实现单项链表

    单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...

  10. python之路39 前端开始 各种标签

    前端前夕 前端三剑客 HTML 网页的骨架 CSS 网页的样式 JavaScript 网页的动态 1.编写服务端 2.浏览器充当客户端访问服务端 3.浏览器无法正常展示服务端内容(因为服务端得数据没用 ...