解决方案 »

  1.   

    取得ColumnName,利用反射进行赋值。
      

  2.   

    很遗憾的告诉你,如果你确实有300个字段需要赋值,那不管你用什么方法,最后还是要至少写300行字段。至于小的优化,倒是可以做一点,比如这里:
    dr["to_cn_coutry"] == DBNull.Value ? "" : dr["to_cn_coutry"].ToString();
    很显然,可以把SqlDataReader dr拓展一下,改成
    public static String getString(this SqlDataReader reader, string field)
    {
        return reader[field] == DBNull.Value ? string.Empty : reader[field].ToSTring();
    }并且,何必要用SqlDataReader,直接用IDataReader不可以吗?如果无特殊需求,最好把参数要求“放开”一些。我不提倡用反射,因为没有什么必要。我们当然希望代码越干净越好,但是很多时候不要为了干净而去做一些overkill的事情。反射可以用,但是应该用在更“聪明”的地方。
      

  3.   

    嗯,我已经用反射解决了,谢谢各位大神,一次发帖,CSDN果然都是大神!代码如下:
     public static void SetValueFromObj2(object obj, SqlDataReader dr)
            {
                Type type1 = obj.GetType();
                foreach (PropertyInfo property in type1.GetProperties())
                {
                    string name = property.Name;
                    if (name != "order_id_info")
                    {
                        if (property.PropertyType.ToString() == "System.String")
                        {
                            property.SetValue(obj, dr[name] == DBNull.Value ? string.Empty : dr[name].ToString(), null);
                        }
                        else if (property.PropertyType.ToString() == "System.Int32" || property.PropertyType.ToString() == "System.Double" || property.PropertyType.ToString() == "System.Decimal" || property.PropertyType.ToString() == "System.Single")
                        {
                            property.SetValue(obj, dr[name] == DBNull.Value ? 0 : dr[name], null);
                        }
                        else if (property.PropertyType.ToString() == "System.DateTime")
                        {
                            property.SetValue(obj, dr[name] == DBNull.Value ? DateTime.MinValue : Convert.ToDateTime(dr[name]), null);
                        }
                    }            }
            }