//测试类

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. go-carbon 1.5.3 版本发布, 修复已知 bug 和新增俄罗斯语翻译文件

    carbon 是一个轻量级.语义化.对开发者友好的golang时间处理库,支持链式调用. 目前已被 awesome-go 收录,如果您觉得不错,请给个star吧 github.com/golang-m ...

  2. 1.5.6 NN与2NN-hadoop-最全最完整的保姆级的java大数据学习资料

    目录 1.5.6 NN与2NN 1.5.6.1 HDFS元数据管理机制 1.5.6.2 Fsimage与Edits文件解析 1.5.6.2.1 Fsimage文件内容 1.5.6.2.2 Edits文 ...

  3. 同步异步、mutiprocessing创建进程process模块及进程对象的多种方法、消息队列Queue

    目录 同步异步 阻塞与非阻塞 综合使用 创建进程的多种方式之multiprocess.process模块 进程间数据隔离 进程的join方法 IPC机制 生产者 消费者模型 进程对象的多种方法 守护进 ...

  4. Linux基础守护进程、高级IO、进程间通信

    守护进程(Daemon) 前言 Linux常用于服务器,程序通常不运行在前台.运行于前台的进程和终端关联,一旦终端关闭,进程也随之退出.因为守护进程不和终端关联,因此它的标准输出和标准输入也无法工作, ...

  5. flutter系列之:flutter中listview的高级用法

    目录 简介 ListView的常规用法 创建不同类型的items 总结 简介 一般情况下,我们使用Listview的方式是构建要展示的item,然后将这些item传入ListView的构造函数即可,通 ...

  6. 区块链特辑——solidity语言基础(七)

    Solidity语法基础学习 十.实战项目(二): 3.项目实操: ERC20 代币实战 ①转账篇 总发行量函数 totalSupply() return(uint256) ·回传代币的发行总量 ·使 ...

  7. 腾讯出品小程序自动化测试框架【Minium】系列(二)项目配置及测试套件使用说明

    一.写在前面 真的人这一散漫惯了,收心就很难了,上午把小程序开发环境启动后,在QQ游戏里,杀了三把象棋,5把2D桌球,一上午没了,还是没法心静下来去学点东西. 那就老样子,逼着自己开始,找到 &quo ...

  8. (20)go-micro微服务Elasticsearch使用

    目录 一 Elasticsearch介绍 二 Elasticsearch的主要功能及应用场景 1.Elasticsearch 主要具有如下功能: 2.Elasticsearch 的主要应用场景如下: ...

  9. 看不懂打我系列------图文并茂基于CentOS Linux release 7.8.2003 Core安装并Docker化你的Node.js应用

    @图文并茂基于CentOS Linux release 7.8.2003 Core安装并Docker化你的Node.js应用 简体中文 | English 说明 本文介绍如何在CentOS Linux ...

  10. linux/windows解决/关闭端口占用

    Linux 找到占用端口的进程信息: netstat -lnp|grep 端口号 例如:netstat -lnp|grep 8080 就是找到正在使用8080端口的进程 关闭进程: kill -9 进 ...