zoukankan      html  css  js  c++  java
  • 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 = 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
    
        }
    }
  • 相关阅读:
    数组作业:例题5.1.一个10个元素一维数组的赋值与遍历
    java子父类初始化顺序 (1)父类静态代码块(2)父类静态变量初始化(3)子类静态代码块(4)子类静态变量初始化(5)main(6)有对象开辟空间都为0(7)父类显示初始化(8)父类构造(9)子类显示初始化(10)子类构造
    如果实现接口的类只使用一次用处不大换为如下简便写法——匿名内部类
    1、实现接口的抽象类——适配器;2、代理公司的方法——功能更强大的包装类;3、接口的使用——工厂模式(高内聚低耦合)
    内部类的作用?1、抽象类中包含一个内部接口如何实现与调用 ;2、接口中包含一个内部抽象类如何调用
    接口的多态使用; 接口应用实例:U盘、打印机可以使用共同的USB接口,插入到电脑上实现各自的功能。
    接口的定义——默认加public abstract默认全局常量;与继承不同,子类可以同时实现多个接口;抽象类实现接口;接口继承接口
    EBCDIC to ASCII
    how to pass variable from shell script to sqlplus
    关于Insufficient space for shared memory file解决办法
  • 原文地址:https://www.cnblogs.com/wangchuang/p/7661284.html
Copyright © 2011-2022 走看看