using System;
using System.Data;
using System.Reflection; namespace DBUtility
{
/// <summary>
/// 对象实例操作辅助类
/// </summary>
public static class InstanceHelper
{
/// <summary>
/// 根据对象的属性名称,获取属性的值(用于根据对象自动完成参数化sql语句的赋值操作)
/// </summary>
/// <param name="propertyName">属性名称(忽略大小写)</param>
/// <param name="objectInstance">对象实例</param>
/// <param name="objectType">对象实例类型</param>
/// <returns>属性的值</returns>
public static object GetPropertyValue(string propertyName, object objectInstance, Type objectType)
{
PropertyInfo pi = objectType.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
if (pi == null)
throw new ArgumentException("自动设置参数值失败。参数化变量名称" + propertyName + "必须和对象中的属性名称一样。");
if (!pi.CanRead)
throw new ArgumentException("自动设置参数值失败。对象的" + propertyName + "属性没有get方式,无法读取值。"); object value = pi.GetValue(objectInstance, null);
if (value == null)
value = DBNull.Value;
else if (pi.PropertyType.Name == "DateTime" && Convert.ToDateTime(value) == DateTime.MinValue)
value = DBNull.Value;//防止数据库是smalldatetime类型时DateTime.MinValue溢出
return value;
} /// <summary>
/// 将DataReader中的数据自动赋值到对象实例对应的属性
/// 注意:对象实例的属性名称必须和数据库列名相同,可忽略大小写
/// </summary>
/// <param name="dataReader">SqlDataReader等数据阅读器获取的一行数据</param>
/// <param name="objectInstance">对象实例</param>
/// <param name="objectType">对象实例类型</param>
public static void SetPropertyValue(IDataReader dataReader, object objectInstance, Type objectType)
{
for (int i = ; i < dataReader.FieldCount; i++)
{
PropertyInfo pi = objectType.GetProperty(dataReader.GetName(i), BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
if (pi != null && pi.CanWrite && dataReader[i] != DBNull.Value)
{
//如果是int?、bool?、double?等这种可空类型,获取其实际类型,如int?的实际类型是int
Type baseType = Nullable.GetUnderlyingType(pi.PropertyType);
if (baseType != null)
pi.SetValue(objectInstance, Convert.ChangeType(dataReader[i], baseType), null);
else
pi.SetValue(objectInstance, Convert.ChangeType(dataReader[i], pi.PropertyType), null);//设置对象值
}
}
} #region 用于Oracle数据库操作 /// <summary>
/// 根据对象的属性名称,获取属性的值(用于根据对象自动完成参数化sql语句的赋值操作)
/// </summary>
/// <param name="propertyName">属性名称(忽略大小写)</param>
/// <param name="objectInstance">对象实例</param>
/// <param name="objectType">对象实例类型</param>
/// <returns>属性的值</returns>
public static object GetPropertyValue2(string propertyName, object objectInstance, Type objectType)
{
PropertyInfo pi = objectType.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
if (pi == null)
throw new ArgumentException("自动设置参数值失败。参数化变量名称必须和对象中的属性名称一样。");
if (!pi.CanRead)
throw new ArgumentException("自动设置参数值失败。对象的" + propertyName + "属性没有get方式,无法读取值。"); object value = pi.GetValue(objectInstance, null);
if (value == null)
value = DBNull.Value;
else if (pi.PropertyType.Name == "DateTime" && Convert.ToDateTime(value) == DateTime.MinValue)
value = DBNull.Value;
else if (pi.PropertyType.Name == "Boolean")//oracle数据库用char(1)作为bool类型
value = OraBit(Convert.ToBoolean(value));
return value;
} /// <summary>
/// 将DataReader中的数据自动赋值到对象实例对应的属性
/// 注意:对象实例的属性名称必须和数据库列名相同,可忽略大小写
/// </summary>
/// <param name="dataReader">OracleDataReader获取的一行数据</param>
/// <param name="objectInstance">对象实例</param>
/// <param name="objectType">对象实例类型</param>
public static void SetPropertyValue2(IDataReader dataReader, object objectInstance, Type objectType)
{
for (int i = ; i < dataReader.FieldCount; i++)
{
PropertyInfo pi = objectType.GetProperty(dataReader.GetName(i), BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
if (pi != null && pi.CanWrite && dataReader[i] != DBNull.Value)
{
Type baseType = Nullable.GetUnderlyingType(pi.PropertyType);//获取其实际类型,如int?的实际类型是int
if (baseType != null)//如果是int?、bool?、double?等可空类型
{
if (baseType.Name == "Boolean")
pi.SetValue(objectInstance, OraBool(dataReader[i].ToString()), null);
else
pi.SetValue(objectInstance, Convert.ChangeType(dataReader[i], baseType), null);
}
else
{
if (pi.PropertyType.Name == "Boolean")
pi.SetValue(objectInstance, OraBool(dataReader[i].ToString()), null);
else
pi.SetValue(objectInstance, Convert.ChangeType(dataReader[i], pi.PropertyType), null);//设置对象值
}
}
}
} /// <summary>
/// Converter to use boolean data type with Oracle
/// </summary>
/// <param name="value">Value to convert</param>
/// <returns></returns>
public static string OraBit(bool value)
{
if (value)
return "Y";
else
return "N";
} /// <summary>
/// Converter to use boolean data type with Oracle
/// </summary>
/// <param name="value">Value to convert</param>
/// <returns></returns>
public static bool OraBool(string value)
{
if (value.Equals("Y"))
return true;
else
return false;
} #endregion }
}

C#读取对象实例的值和对对象的属性自动赋值方法的更多相关文章

  1. 如何把一个数组中的对象的key值相等的对象合成一个对象

    比如这样一个数组:[{category:"中国梦",value:"10000"},{category:"有国才有家",value:" ...

  2. JavaScript 原始值与包装对象

    前言 随着 JavaScript 越来越流行,越来越多地开发者开始接触并使用 JavaScript. 同时我也发现,有不少开发者对于 JavaScript 最基本的原始值和包装对象都没有很清晰的理解. ...

  3. Python笔记(七):字典、类、属性、对象实例、继承

    (一)  简单说明 字典是Python的内置数据结构,将数据与键关联(例如:姓名:张三,姓名是键,张三就是数据).例如:下面这个就是一个字典 {'姓名': '张三', '出生日期': '2899-08 ...

  4. python 全栈开发,Day18(对象之间的交互,类命名空间与对象,实例的命名空间,类的组合用法)

    一.对象之间的交互 现在我们已经有一个人类了,通过给人类一些具体的属性我们就可以拿到一个实实在在的人.现在我们要再创建一个狗类,狗就不能打人了,只能咬人,所以我们给狗一个bite方法.有了狗类,我们还 ...

  5. python基础之类和对象、对象之间的交互、类名称空间与对象/实例名称空间

    一 面向对象初识 Python要么是面向过程要么是面向对象. 概念及优缺点: 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东 ...

  6. JavaScript Browser 对象 实例

    使用JavaScript来访问和控制浏览器对象实例. Window 对象 弹出一个警告框 弹出一个带折行的警告框 弹出一个确认框,并提醒访客点击的内容 弹出一个提示框 点击一个按钮时,打开一个新窗口 ...

  7. XHR 对象实例所有的配置、属性、方法、回调和不可变值

    当我们声明了一个XMLHttpRequest对象的实例的时候,使用for-in来循环遍历一下这个实例(本文使用的是chrome45版本浏览器),我们会发现在这个实例上绑定了一些内容,我把这些内容进行了 ...

  8. python 四种方法修改类变量,实例对象调用类方法改变类属性的值,类对象调用类方法改变类属性的值,调用实例方法改变类属性的值,直接修改类属性的值

    三种方法修改类变量,实例对象调用类方法改变类属性的值,类对象调用类方法改变类属性的值,调用实例方法改变类属性的值,类名就是类对象,city就是类变量, #coding=utf-8 class empl ...

  9. 服务器端调用Word组件读取Word权限、未将对象引用到对象实例终极解决方案

    最近因为业务需要,需要在服务器上调用Word组件,结果遇到各种问题,比如检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败 ...

随机推荐

  1. Java 共享数据读写(多线程)

    public class StopThread { // 静态字段的读写不必须要同步才能生效,尽管读写是原子的(atom) private static boolean stopRequested; ...

  2. 利用Linux文件系统内存cache来提高性能

    https://www.linuxjournal.com/article/6345 利用Linux文件系统内存cache来提高性能 本地磁盘文件->socket发送,4步骤数据流向: hard ...

  3. Qt Installer Framework 使用说明(二)

    目录 4.教程: 创建一个安装程序 创建软件包目录 创建配置文件 创建程序包信息文件 指定组件信息 指定安装程序版本 添加许可证 选择默认内容 创建安装程序内容 创建安装程序二进制文件 5.创建安装程 ...

  4. Arduino和C51开发DHT11温湿度传感器

    技术:51单片机.Arduino.DHT11.温湿度传感器.传感器   概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...

  5. 如何查看 EBS 环境上的 INV RUP 版本号

    select 'Application Environment: '|| i.instance_name || ', Host: '|| i.host_name ||', Application Re ...

  6. Spring 多数据源事务配置问题

    2009-12-22 在SpringSide 3 中,白衣提供的预先配置好的环境非常有利于用户进行快速开发,但是同时也会为扩展带来一些困难.最直接的例子就是关于在项目中使用多个数据源的问题,似乎 很难 ...

  7. c++ 静态类成员函数(static member function) vs 名字空间 (namespace)

    好多人喜欢把工具函数做成static member function.这样以增加隐蔽性和封装性,由其是从C#,java转而使用c++的开发人员. 例如: class my_math { public: ...

  8. ios实例开发精品文章推荐(8.14)

    1.iOS源码:俄罗斯方块实现简单的俄罗斯方块游戏.<ignore_js_op> 下载地址:http://www.apkbus.com/android-124628-1-1.html 2. ...

  9. 使用Servlet发布WebService

    首先感谢熔岩的文章: http://lavasoft.blog.51cto.com/62575/227988 1.Eclipse安装上tomcat插件,http://www.eclipsetotale ...

  10. React(0.13) 组件的组合使用

    <html> <head> <title>组件的组合调用</title> <script src="build_0.13/react.m ...