• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#读取对象实例的值和对对象的属性自动赋值方法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
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 = 0; 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 = 0; 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

    }
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C++的STL总结(1)发布时间:2022-07-13
下一篇:
c#中关于String、string,Object、object,Int32、int发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap