今天写了一个数据库的帮助类,代码如下。

 public static class DbEx
{
public static dynamic ReadToObject(this IDataReader reader)
{
var obj = new DbObject(); for (int i = ; i < reader.FieldCount; i++)
{
obj[reader.GetName(i)] = new DbField()
{
DbData = reader[i]
};
} return obj;
} public class DbObject : DynamicObject
{
//自己实现一个,不用ExpandoObject, 以支持无视大小写读取
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this[binder.Name];
return true;
} Dictionary<string, object> _values = new Dictionary<string, object>(StringComparer.CurrentCultureIgnoreCase); public object this[string index]
{
get => _values[index];
set => _values[index] = value;
}
} public class DbField
{
public object DbData { get; set; } public T Value<T>()
{
return (T)Convert.ChangeType(DbData, typeof(T));
} public static implicit operator string(DbField data) => data.Value<string>();
public static implicit operator int(DbField data) => data.Value<int>();
public static implicit operator DateTime(DbField data) => data.Value<DateTime>();
public static implicit operator double(DbField data) => data.Value<double>();
public static implicit operator bool(DbField data) => data.Value<bool>();
}
}

简单的来讲,可以把如下代码

GpsData parse(IDataReader reader)
{
    return
new
GpsData()
    {
        IsValid = (bool)reader["IsValid"],
        Location = new
Location ()
        {
            Lon = (double)reader["Lon"],
            Lat = (double)reader["Lat"],
        },
        Angle = (double)reader["Angle"],
        Speed = (double)reader["Speed"]),
        UpdateTime = (double)reader["Speed"]),
    };
}

转换为如下形式

GpsData
parse(IDataReader reader)
{
    var obj = reader.ReadToObject();
    var state = new
GpsData()
    {
        IsValid = obj.IsValid,
        Location = new
Location()
        {
            Lon = obj.Lon,
            Lat = obj.Lat,
        },
        Angle = obj.Angle,
        Speed = obj.Speed,
        UpdateTime = obj.UpdateTime,
    };
    return state;
}

主要还是利用dynamic的特性,转换成这样的好处有:

  1. 以属性的方式替换下标方式读取,更加间接直观
  2. 属性的方式读取变量时不分大小写
  3. 支持自动类型转换,例如,如果数据库里的类型是int型,而目标是string型,会进行自动类型转换
  4. 自动识别目标类型,不需要显示强制类型转换,更加简洁

利用dynamic简化数据库的访问的更多相关文章

  1. Python基础(三):简化除法判断、分析apache访问日志、扫描存活主机、利用多线程实现ssh并发访问

    一.简化除法判断 目标: 编写mydiv.py脚本,主要要求如下: 提示用户输入一个数字作为除数 如果用户按下Ctrl+C或Ctrl+D则退出程序 如果用户输入非数字字符,提示用户应该输入数字 如果用 ...

  2. 走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能

    原文:走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能 最近公司来一个非常虎的dba  10几年的经验 这里就称之为蔡老师吧 在征得我们蔡老同意的前提下  我们来分享一下蔡老给我们 ...

  3. 八:SpringBoot-集成JPA持久层框架,简化数据库操作

    SpringBoot-集成JPA持久层框架,简化数据库操作 1.JPA框架简介 1.1 JPA与Hibernate的关系: 2.SpringBoot整合JPA Spring Data JPA概述: S ...

  4. 【DG】利用闪回数据库(flashback)修复Failover后的DG环境

    利用闪回数据库(flashback)修复Failover后的DG环境 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能, ...

  5. 如何利用反射简化Servlet操作

    如何利用反射简化Servlet操作   一.反射的实现 新建类BaseServlet,继承HttpServlet(不需要在web.xml文件中配置) 1.在doPost()方法中处理请求乱码,并调用d ...

  6. 利用Helm简化Kubernetes应用部署(1)

    目录 利用Helm简化Kubernetes应用部署  Helm基础  安装Helm  使用Visual Studio 2019为Helm编写一个简单的应用    利用Helm简化Kubernetes应 ...

  7. 利用Helm简化Kubernetes应用部署(2)

    目录 定义Charts  使用Helm部署Demo  Helm常用操作命令  定义Charts 回到之前的“charts”目录,我们依次进行解读并进行简单的修改. Chart.yaml 配置示例: a ...

  8. Java套接字实现应用程序对数据库的访问

    最近在完成软件体系结构上机实验时,遇到一个有点点小难度的选做题,题目信息如下: 利用套接字技术实现应用程序中对数据库的访问.应用程序只是利用套接字连接向服务器发送一个查询的条件,而服务器负责对数据库的 ...

  9. Git中如何利用生成SSH个人公钥访问git仓库

    Git中如何利用生成SSH个人公钥访问git仓库方法(这里以coding平台为例): 1. 获取 SSH 协议地址 在项目的代码页面点击 SSH 切换到 SSH 协议, 获得访问地址, 请使用这个地址 ...

随机推荐

  1. Java基本数据类型装箱的127临界点

    package wrapper.demo; public class WrapperDemo { /** * @param args */ public static void main(String ...

  2. PyTorch学习系列(九)——参数_初始化

    from:http://blog.csdn.net/VictoriaW/article/details/72872036 之前我学习了神经网络中权值初始化的方法 那么如何在pytorch里实现呢. P ...

  3. Linux内核启动流程分析(一)【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-3380535.html 很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下.由于是word直接 ...

  4. Linux下USB转串口的驱动【转】

    转自:http://www.linuxidc.com/Linux/2011-02/32218.htm Linux发行版自带usb to serial驱动,以模块方式编译驱动,在内核源代码目录下运行Ma ...

  5. linux下常用FTP命令 上传下载文件【转】

    1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...

  6. 005_系统运维之SLA与SLO的关系

    服务水平协议(简称:SLA,全称:service level agreement)是在一定开销下为保障服务的性能和可靠性,服务提供商与用户间定义的一种双方认可的协定.通常这个开销是驱动提供服务质量的主 ...

  7. redis,nodejs,php,pub/sub 实战: 微信语音识别

    2015年5月22日 20:20:20 星期五 效果: 这边对微信说话,  浏览器端及时显示语音识别的文字 注意: 在连接socket.io时, 按下浏览器f12, 如果一直有请求不断的刷, 说明so ...

  8. win7(x64)安装scrapy框架

    Scrapy(官网http://scrapy.org/)是Python开发网络爬虫,一个极好的开源工具.本次安装Scrapy确实不易啊.居然花了2天多时间,需要的支持包比较多,这些支持包相互之间的依赖 ...

  9. 转:Vue-cli proxyTable 解决开发环境的跨域问题

    转:http://www.jianshu.com/p/95b2caf7e0da 和后端联调时总是会面对恼人的跨域问题,最近基于Vue开发项目时也遇到了这个问题,两边各自想了一堆办法,查了一堆资料,加了 ...

  10. postman发送json请求,使用案例

    介绍:  postman是一个很好的http模拟器,,可以发送get.post.put等各种请求,是测试服务接口相当好的工具. postman发送json请求,使用案例 发送json的具体步骤: 1. ...