none
关于反射的一个问题 RRS feed

  • 问题

  • // dr 是dataReader 从数据库读出来的

    public T AssemblyEntity( IDataReader dr )
            {
                T temp = new T();
                PropertyInfo[] propertys = temp.GetType().GetProperties();
                for ( int i = 0; i < propertys.Length; i++ )
                {
                    PropertyInfo info = propertys[i];
                    Type cloumType = info.PropertyType;
                    info.SetValue(temp, Convert.ChangeType(dr[info.Name], cloumType), null);
                }

                return temp;
          }

     

    请问我这样写有什么问题吗,各方面的,比如性能啊,什么的

    2011年8月3日 11:23

答案

全部回复

  • // dr 是dataReader 从数据库读出来的

    public T AssemblyEntity( IDataReader dr )
            {
                T temp = new T();
                PropertyInfo[] propertys = temp.GetType().GetProperties();
                for ( int i = 0; i < propertys.Length; i++ )
                {
                    PropertyInfo info = propertys[i];
                    Type cloumType = info.PropertyType;
                    info.SetValue(temp, Convert.ChangeType(dr[info.Name], cloumType), null);
                }

                return temp;
          }

     

    请问我这样写有什么问题吗,各方面的,比如性能啊,什么的


    应该可以正常运行。性能也可。但是:确保类型可以正常转换。因此您的columnType如果是一个自定义类,必须实现IConvertable接口!


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年8月4日 4:55
  • 是的,会报错 

    我改成这样了

      public static T AssemblyEntity(IDataReader dr)
            {
                T temp = new T();
                PropertyInfo[] propertys = temp.GetType().GetProperties();
                for (int i = 0; i < propertys.Length; i++)
                {
                    PropertyInfo info = propertys[i];
                    Type cloumType = info.PropertyType;
                    object value = dr[info.Name];

                    if (value is DBNull)
                    {
                        value = cloumType.IsValueType ? Activator.CreateInstance(cloumType) : null;
                    }

                    info.SetValue(temp, Convert.ChangeType(value, cloumType), null);
                }

                return temp;
            }

    2011年8月5日 1:51
  • 是的,会报错 

    我改成这样了

      public static T AssemblyEntity(IDataReader dr)
            {
                T temp = new T();
                PropertyInfo[] propertys = temp.GetType().GetProperties();
                for (int i = 0; i < propertys.Length; i++)
                {
                    PropertyInfo info = propertys[i];
                    Type cloumType = info.PropertyType;
                    object value = dr[info.Name];

                    if (value is DBNull)
                    {
                        value = cloumType.IsValueType ? Activator.CreateInstance(cloumType) : null;
                    }

                    info.SetValue(temp, Convert.ChangeType(value, cloumType), null);
                }

                return temp;
            }


    不可以啊!

    你既然value为null,怎么还可以进行类型转换呢?Convert.ChangeType(value, cloumType),?你把一个null的东西转换成columnType当然不可以的。

    我的解决方法:

     if (value is DBNull.Value || value == null)
    {

                        value = cloumType.IsValueType ? Activator.CreateInstance(cloumType) : default(cloumType) ;
                        
    info.SetValue(temp, value,null);
             
    }
    else
    {
     
        info.SetValue(temp, Convert.ChangeType(value, cloumType), null);

    }


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年8月5日 2:18
  •  if (value is DBNull.Value || value == null)
    {
    value = cloumType.IsValueType ? Activator.CreateInstance(cloumType) : default(cloumType) ;   //这个好像不能执行的
    info.SetValue(temp, value,null);

    }
    else
    {
    info.SetValue(temp, Convert.ChangeType(value, cloumType), null);

    }
    2011年8月5日 5:19
  • 对不起,代码做如下变动:

     if (value is DBNull.Value || value == null)
    {
    value = cloumType.IsValueType ? Activator.CreateInstance(cloumType) : null;  

    info.SetValue(temp, value,null);

    }
    else
    {
    info.SetValue(temp, Convert.ChangeType(value, cloumType), null);

    }


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年8月5日 5:26