//测试类

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创建定时删除日志任务

    定时删除3天前的所有日志文件: 1.例:脚本对应的要删除的目录为/home/logs在home目录创建文件clearLogFiles.sh:cd /homevim clearLogFiles.sh写入 ...

  2. Qt_CLion

    目录 安装Qt和CLion 配置 CLion配置Qt的资源文件系统 在项目根文件夹下创建一个资源文件夹 在项目根目录下创建一个qrc文件 安装Qt和CLion 相关的安装网上有很多教程,安装步骤这里不 ...

  3. Java语言进阶 day02【Collection、泛型】

    主要内容 Collection集合 迭代器 增强for 泛型 教学目标

  4. 单点登录系统使用Spring Security的权限功能

    背景 在配置中心增加权限功能 目前配置中心已经包含了单点登录功能,可以通过统一页面进行登录,登录完会将用户写入用户表 RBAC的用户.角色.权限表CRUD.授权等都已经完成 希望不用用户再次登录,就可 ...

  5. appium环境搭建(从入门到放弃)

    一.appium环境搭建 1.python3 python3的下载安装这里就不多做介绍了,当然你也可以选择自己喜欢的语音,比如java.... 2.jdk 1)下载地址 官网(需登录账号): http ...

  6. C++进阶(unordered_set+unordered_map模拟实现)

    unordered_set unordered_set是以无特定顺序存储唯一元素的容器,并且允许根据它们的值快速检索单个元素,是一种K模型. 在unordered_set中,元素的值同时是它的key, ...

  7. 前后端开发必会的 HTTP 协议“十全大补丸”(万字长文)

    本文全面介绍了 HTTP 协议相关知识,包括 HTTP 请求报文.响应报文.持久连接.缓存.Cookie 以及 HTTP 版本升级等! HTTP 协议全称为 HyperText Transfer Pr ...

  8. C语言常用知识总结

    在 C 语言中,常量是一种固定值的标识符,它的值在程序执行期间不会改变. C 语言中有几种不同类型的常量: 字符常量:用单引号括起来的单个字符,例如 'A'.'b'.'1' 等. 字符串常量:用双引号 ...

  9. CVE-2022-32532 Apache Shiro 身份认证绕过

    漏洞名称 CVE-2022-32532 Apache Shiro 身份认证绕过 利用条件 Apache Shiro < 1.9.1 漏洞原理 使用RegexRequestMatcher进行权限配 ...

  10. python之路51 聚合查询 分组查询

    图书管理系统 1.表设计 先考虑普通字段再考虑外键字段 数据库迁移.测试数据录入 2.首页展示 3.书籍展示 4.书籍添加 5.书籍编辑 后端如何获取用户想要编辑的数据.前端如何展示出待编辑的数据 6 ...