public static class LogParser
{
/// <summary>
/// 对象转为JSON
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public static string Parse(Object model)
{
if (model == null)
{
return "null";
}
Type type = model.GetType();
if (type.IsPrimitive)//基本类型
{
if (model is Boolean)
{
return model.ToString().ToLower();
}
return model.ToString();
}
else if (model is string || model is DateTime || model is Enum || model is ObjectId)//字符串
{
return $"\"{model.ToString()}\"";
}
else if (model is IDictionary dictionary)//Dictionary字段
{
return ParseDictionary(dictionary);
}
else if (model is IEnumerable enumerable)//可遍历的集合
{
return ParseEnumerable(enumerable);
}
else //实体对象
{
return ParseObject(model);
}
} /// <summary>
/// 字典类型
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
private static string ParseDictionary(IDictionary dic)
{
StringBuilder jsonBuffer = new StringBuilder("{");
List<string> lstKV = new List<string>();
foreach (var key in dic.Keys)
{
lstKV.Add($"{Parse(key)}:{Parse(dic[key])}");
}
jsonBuffer.AppendJoin(",", lstKV);
jsonBuffer.Append("}");
return jsonBuffer.ToString();
} /// <summary>
/// 集合类型
/// </summary>
/// <param name="enumerable"></param>
/// <returns></returns>
private static string ParseEnumerable(IEnumerable enumerable)
{
StringBuilder jsonBuffer = new StringBuilder("["); List<string> lstItems = new List<string>();
foreach (var item in enumerable)
{
lstItems.Add(Parse(item));
} jsonBuffer.AppendJoin(",", lstItems);
jsonBuffer.Append("]");
return jsonBuffer.ToString();
} /// <summary>
/// 对象类型
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private static string ParseObject(Object obj)
{
StringBuilder jsonBuffer = new StringBuilder("{");
List<string> lstKV = new List<string>();
foreach (var prop in obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy))
{
string value = Parse(prop.GetValue(obj));
string name = prop.GetCustomAttribute<DescriptionAttribute>()?.Description ?? prop.Name;
lstKV.Add($"\"{name}\":{value}");
}
jsonBuffer.AppendJoin(",", lstKV);
jsonBuffer.Append("}");
return jsonBuffer.ToString();
}
}

C#实体类对象修改日志记录的更多相关文章

  1. Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)

    上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...

  2. Hibernate_day02--课程安排_主键生成策略_对实体类crud操作_实体类对象状态

    Hibernate_day02 上节内容 今天内容 实体类编写规则 Hibernate主键生成策略 实体类操作 对实体类crud操作 添加操作 根据id查询 修改操作 删除操作 实体类对象状态(概念) ...

  3. NSDictionary转化为实体类对象

    方法一: 使用objective-c NSObject自带的方法 setValuesForKeysWithDictionary:dict 作用是: 如果NSDictionary中的key和实体类对象的 ...

  4. java 获取实体类对象属性值的方法

    在java中我们要获得实体类对象的属性,一般情况是将实体类中的属性私有化,然后再对外提供get()与set()方法,然后再获取实体类对象的属性的时候先把对象new出来,再用变量名.get()的方法得到 ...

  5. @NamedEntityGraphs --JPA按实体类对象参数中的字段排序问题得解决方法

    JPA按实体类对象参数中的字段排序问题得解决方法@Entity @Table(name="complaints") @NamedEntityGraphs({ @NamedEntit ...

  6. 使用fastjson 进行jsonObject转实体类对象

    使用fastjson 进行jsonObject转实体类对象   1 <dependency> 2 <groupId>com.alibaba</groupId> 3 ...

  7. solr搜索结果转实体类对象的两种方法

    问题:就是把从solr搜索出来的结果转成我们想要的实体类对象,很常用的情景. 1.使用@Field注解 @Field这个注解放到实体类的属性[字段]中,例如下面 public class User{ ...

  8. SpringBoot实体类对象和json格式的转化

    1.引入maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson ...

  9. c# 利用反射动态给实体类对象赋值

    转:http://blog.sina.com.cn/s/blog_659a572b0100xp5s.html 例子如下 using System; using System.Collections.G ...

随机推荐

  1. 09 - JavaSE之线程

    线程 线程的基本概念 线程是一个程序里面不同的执行路径. 进程与线程的区别 每个进程都有独立的代码和数据空间(进程上下文),进程间的切换开销大. 线程可以看作轻量级的进程,同一类线程共享代码和数据空间 ...

  2. notepad++上搭建gtk+2.0/3.x开发环境

    前言 老师布置了一道题需要用到图形界面,于是开始找图形库.最后选择了gtk+图形库,然后折腾了大概一天. 这里记录自己新学到的知识,同时也给后来者一些便利. 准备 下载以下内容 notepad++(由 ...

  3. sersync+rsync=实时异步备份

    环境准备 服务器两台 rsync-server:192.168.1.8  (备份服务器) sersync-node1:192.168.1.9 (需要备份的服务器) 系统 CentOS7.4 关闭防火墙 ...

  4. NLP Attention

    一.概述 自动摘要可以从很多角度进行分类,例如单文档摘要/多文档摘要.单语言摘要/跨语言摘要等.从技术上说,普遍可以分为三类: i. 抽取式摘要(extractive),直接从原文中抽取一些句子组成摘 ...

  5. linux tar 命令

    tar [-cxtzjvfpPN] 文件与目录 ....参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个压缩文件的参数指令!-t :查看 tarfile 里面的文件! ...

  6. [C++][转]CPU字节序 网络序 主机序 大端小端

    原帖:http://www.cnblogs.com/darktime/p/3298075.html 不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序最常见的有两种1 ...

  7. 阿里巴巴Java开发手册(详尽版)-个人未注意到的知识点(转)

    转自 https://blog.csdn.net/u013039395/article/details/86528164 一.编程规约 (一) 命名风格 [强制]代码中的命名只可用英文方式 [强制]类 ...

  8. Java对象的强、软、弱和虚引用+ReferenceQueue

    Java对象的强.软.弱和虚引用+ReferenceQueue 一.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足 ...

  9. ssh连接工具中文乱码问题

    在终端运行: export LC_ALL=zh_CN.GB2312;export LANG=zh_CN.GB2312

  10. 小白学习之Code First(二)

    Code First约定: 注:EDMX模板 (SSDL:存储模型=>数据库表 ,CSDL:概念模型=>实体,C-S模型=>存储和概念模型之间的映射关系) System.Data.E ...