C#读取对象实例的值和对对象的属性自动赋值方法
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#读取对象实例的值和对对象的属性自动赋值方法的更多相关文章
- 如何把一个数组中的对象的key值相等的对象合成一个对象
比如这样一个数组:[{category:"中国梦",value:"10000"},{category:"有国才有家",value:" ...
- JavaScript 原始值与包装对象
前言 随着 JavaScript 越来越流行,越来越多地开发者开始接触并使用 JavaScript. 同时我也发现,有不少开发者对于 JavaScript 最基本的原始值和包装对象都没有很清晰的理解. ...
- Python笔记(七):字典、类、属性、对象实例、继承
(一) 简单说明 字典是Python的内置数据结构,将数据与键关联(例如:姓名:张三,姓名是键,张三就是数据).例如:下面这个就是一个字典 {'姓名': '张三', '出生日期': '2899-08 ...
- python 全栈开发,Day18(对象之间的交互,类命名空间与对象,实例的命名空间,类的组合用法)
一.对象之间的交互 现在我们已经有一个人类了,通过给人类一些具体的属性我们就可以拿到一个实实在在的人.现在我们要再创建一个狗类,狗就不能打人了,只能咬人,所以我们给狗一个bite方法.有了狗类,我们还 ...
- python基础之类和对象、对象之间的交互、类名称空间与对象/实例名称空间
一 面向对象初识 Python要么是面向过程要么是面向对象. 概念及优缺点: 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东 ...
- JavaScript Browser 对象 实例
使用JavaScript来访问和控制浏览器对象实例. Window 对象 弹出一个警告框 弹出一个带折行的警告框 弹出一个确认框,并提醒访客点击的内容 弹出一个提示框 点击一个按钮时,打开一个新窗口 ...
- XHR 对象实例所有的配置、属性、方法、回调和不可变值
当我们声明了一个XMLHttpRequest对象的实例的时候,使用for-in来循环遍历一下这个实例(本文使用的是chrome45版本浏览器),我们会发现在这个实例上绑定了一些内容,我把这些内容进行了 ...
- python 四种方法修改类变量,实例对象调用类方法改变类属性的值,类对象调用类方法改变类属性的值,调用实例方法改变类属性的值,直接修改类属性的值
三种方法修改类变量,实例对象调用类方法改变类属性的值,类对象调用类方法改变类属性的值,调用实例方法改变类属性的值,类名就是类对象,city就是类变量, #coding=utf-8 class empl ...
- 服务器端调用Word组件读取Word权限、未将对象引用到对象实例终极解决方案
最近因为业务需要,需要在服务器上调用Word组件,结果遇到各种问题,比如检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败 ...
随机推荐
- flink 入门
http://ifeve.com/flink-quick-start/ http://vinoyang.com/2016/05/02/flink-concepts/ http://wuchong.me ...
- android手机导入.cer证书文件的方法
访问很多https协议的网站需要安装证书,手机也可以导入cer文件,你知道么?本文将通过简单的两步告诉你手机安装cer文件的方法. 步骤一:请先将数字证书文件“******.cer”文件复制到SD卡的 ...
- ios core plot设置xy坐标
#import "ViewController.h" @interface ViewController () //要绘制基于x,y轴的图形 @property(nonatomic ...
- (原)tensorflow保存模型及载入保存的模型
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/7198773.html 参考网址: http://stackoverflow.com/questions ...
- Ubuntu 13.04有线连接异常
最近安装了Ubuntu 13.04 64位版,发现有线连接经常会掉线,通常在连接上一段时间(或长或短)就无法上网,ping不通,但是ifconfig显示一切正常,重启NetworkManager也不行 ...
- Tex
关于Tex,有许多概念.许多软件.这些软件是做什么的,要解决哪些问题,今日好好总结一下. 就像任何领域一旦引入代数系统,一切都会变得井然有序一样.就像用五行八卦描述事物,事物的规律就变得清晰一样,类比 ...
- Java爬虫框架调研
Python中大的爬虫框架有scrapy(风格类似django),pyspider(国产python爬虫框架). 除了Python,Java中也有许多爬虫框架. nutch apache下的开源爬虫程 ...
- nfs的优化
总结和测试了一下自己的经验: NFS中的rsize.wsize rsize.wsize对于NFS的效能有很大的影响.wsize和rsize设定了SERVER和CLIENT之间往来数据块的大小,这两个参 ...
- Win7 U盘安装Ubuntu16.04 双系统详细教程(方法一)
主要分为以下几步: 一. 下载Ubuntu 16.04镜像软件: 二. 制作U盘启动盘使用ultraISO: 三. 安装Ubuntu系统: 四. 用EasyBCD 创建启动系统启动引导: (根据个人情 ...
- 树莓派进阶之路 (016) - 通过595驱动4位LED显示系统时间
模块图片,4位共阳极数码管. 我们使用树莓派wiringPi的库来通过74HC595驱动4位数码管: C 代码如下: #include <wiringPi.h> #include < ...