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} 的组件失败 ...
随机推荐
- Spring DataSource>DBCP & C3P0
Spring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCP,其二是 C3P0.可以在Spring配置文件中利用这两者中任何一个配置数据源. DBCP数据源 DBCP类包位于 ...
- python 怎么模拟加header(如User-Agent、Content-Type等等)
# -*- coding: cp936 -*- #python 27 #xiaodeng #python 怎么模拟加header(如User-Agent.Content-Type等等) #办法一: i ...
- 将Excel表格保存为图片
如何将Excel表格保存为图片,可参见以下几种方法: 1.借助其它办法软件,例如Word或PPT. 步骤:选中Excel中需要被保存成图片的内容,Ctrl+C进行复制,打开Word或PPT办公软件,鼠 ...
- nno Setup入门(一)——最简单的安装脚本
一个最简单的安装脚本: 1.最简单的安装文件脚本: [setup] AppName=Test AppVerName=TEST DefaultDirName="E:\TEST" Ap ...
- openssh基于源码编译覆盖式安装
覆盖式,就是卸载旧的openssh,打扫干净屋子再请客... 注意:请做做好测试工作 00.查看本机已安装的openssh rpm –qa |grep openssh rpm -e openssh-s ...
- 网站PV、UV以及查看方法
网站PV.UV以及查看方法 一.名词解释 PV:PV 是Page Views的缩写,即页面浏览量,用户每一次对网站中的每个网页访问均被记录一次.注意,访客每刷新一次页面,pv就增加一次. UV:UV是 ...
- ios实例开发精品文章推荐(8.5)
IOS基础知识记录 IOS基础知识记录一 http://www.apkbus.com/android-131902-1-1.htmlIOS基础知识记录二 http://ww ...
- JavaScript 字符串(String)对象
String 对象 String 对象用于处理文本(字符串). 创建 String 对象的语法: new String(s); String(s); 参数 参数 s 是要存储在 String 对象中或 ...
- find -exec 与xargs 区别
find . -name "*.txt" -exec rm {} \;find . -name "*.txt" | xargs rm {} -exec 1 ...
- php加密总结
1.md5加密,加密之后是32位的字符串 2.sha1加密, 加密之后是40位的字符串 3.crypt加密, 加密之后是13位的字符串 上面是不可逆的 可逆的如下urlencode --> ur ...