在我的实际对象像中,我已经实现将datarow 显示转换为一个对象,但是我在泛型的方法里面不知道怎么写这个泛型约束。导致将o = (T)row;这条语句出错。显示出错为不能将datarow转换为T        public static List<T> ConvertDataSetToList<T>(DataSet dsObject) where T :class, new()  
        {
            List<T> listT = new List<T>();            if (dsObject != null && dsObject.Tables.Count > 0)
            {
                foreach(DataRow row in  dsObject.Tables[0].Rows)
                {
                    T o = new T();                    //这条语句出错,
                    o = (T)row;
                    
                    listT.Add(o);
                }
            }
            return listT;
        }以下就是具体的某个对象的强制转换        public static explicit operator V_AssetApplyReturnDetail(DataRow row)
        {
            V_AssetApplyReturnDetail assetApplyReturnDetail = new V_AssetApplyReturnDetail();
            assetApplyReturnDetail.ID = Convert.ToInt32(row[AssetBorrowReturnDetail.IDColumn]);
            assetApplyReturnDetail.AssetID = Convert.ToInt32(row[AssetBorrowReturnDetail.AssetIDColumn]);
            assetApplyReturnDetail.ApplyID = Convert.ToInt32(row[AssetBorrowReturnDetail.ApplyIDColumn]);
            assetApplyReturnDetail.Code = row[Asset.CodeColumn].ToString();            return assetApplyReturnDetail;
        }

解决方案 »

  1.   

    谢谢青qldsrx(龙白虎)的回复,接口可能不行,我的对象里面的属性是不同的。没有办法让多个对象都继承某个接口,因为他们都有属于自己的属性
      

  2.   


    谢谢青qldsrx(龙白虎)的回复,接口可能不行,我的对象里面的属性是不同的。没有办法让多个对象都继承某个接口,因为他们都有属于自己的属性
      

  3.   

    public static IList DataSetToIList(DataSet DataSet, int TableIndex)
            {
                if (DataSet == null || DataSet.Tables.Count < 0)
                    return null;
                System.Data.DataTable dt = DataSet.Tables[TableIndex];
                IList result = new List();
                for (int j = 0; j < dt.Rows.Count; j++)
                {
                    T t = (T)Activator.CreateInstance(typeof(T));
                    PropertyInfo[] propertys = t.GetType().GetProperties();
                    foreach (PropertyInfo pi in propertys)
                    {
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            if (pi.Name.Equals(dt.Columns[i].ColumnName))
                            {
                                if (dt.Rows[j][i] != DBNull.Value)
                                    pi.SetValue(t, dt.Rows[j][i], null);
                                else
                                    pi.SetValue(t, null, null);
                                break;
                            }
                        }
                    }
                    result.Add(t);
                }
                return result;
            }
      

  4.   


     谢谢你的回复,我明白你的意思,你是在一个泛型类里面,利用反射的方法来构建这个方法,其实这个方法也是可以实现我要的功能,但是性能可能存在问题。如果datatable里的行数很多,而且泛型实例的属性很多的话,那性能可能存在问题。其实我的方法只是在将某行转换为具体对象时,我是希望能够在该对象的显示转换方法里面去执行,这样不用遍历该对象的属性,性能会好一点,但是泛型的约束里面好像不能把这个转换的约束包含进来,我估计应该是不可以。因为显示约束是一个静态的方法。
      

  5.   

    我发现其实这样就可以了,似乎是你自己多此一举,反而产生了转换问题:
            public static List<T> ConvertDataSetToList<T>(DataSet dsObject) where T : class, new()  
            { 
                List <T> listT = new List <T>();             if (dsObject != null && dsObject.Tables.Count > 0) 
                { 
                    foreach(T row in  dsObject.Tables[0].Rows) 
                    {
                        listT.Add(row); 
                    } 
                } 
                return listT; 
            } 
      

  6.   

    这个问题已经解决,解决的办法是这样的。
    提供一个泛型的接口,用来将datarow转换为某个泛型,
        public interface IobjectConvertInterface<T>
        {
            T ConvertObject(DataRow row);
        }具体的需要转的对象需要继承该对象,并实现该方法。如:
     public class V_AssetApplyReturnDetail : IobjectConvertInterface<V_AssetApplyReturnDetail>
    {
            #region IobjectConvertInterface<V_AssetApplyReturnDetail> 成员        V_AssetApplyReturnDetail IobjectConvertInterface<V_AssetApplyReturnDetail>.ConvertObject(DataRow row)
            {
                return this.ConvertDataRowToAssetApplyReturnDetail(row);
            }        #endregion
    }
    在泛型的方法里面,使用泛型约束。该约束为泛型必须继承这个接口,那么在泛型的方法里面就可以调用这个对象的接口        public static List<T> ConvertDataSetToList<T>(DataSet dsObject) where T : IobjectConvertInterface<T>, new()
            {
                List<T> listT = new List<T>();            if (dsObject != null && dsObject.Tables.Count > 0)
                {
                    foreach (DataRow row in dsObject.Tables[0].Rows)
                    {
                        T o = new T();
                        o = o.ConvertObject(row);                    listT.Add(o);
                    }
                }
                return listT;
            }
    谢谢大家的回复,主要还是靠大家的回复,才有这个想法。谢谢qldsrx(青龙白虎),让我想法接口。
      

  7.   


    兄弟,我的泛型里面其实就是一个具体的实体对象,就是对应于表的对像,我需要将行转换为这个实体对象。
    我写这个方法的目的是,外层调用需要某个对象的集合时,不需要在每个对象里面去将一个dataset转为一个list对象集合,我希望都是调用这个方法,去实现,但是一个具体的datarow对象如何去变成一个实体对象就在该对象的里去实现。因为毕竟dataset里面的是对应不同的表。所以需要各自自己去实现将datarow转成具体的对象
      

  8.   

    foreach内部其实就是强制类型转换,你之前使用的 “foreach(DataRow row in  dsObject.Tables[0].Rows)” 其实是将object强制类型转换到DataRow了,因为dsObject.Tables[0].Rows中每个元素的枚举都是object对象,而不是DataRow对象。既然这样,你何不将自定义强制转换修改一下:
    public static explicit operator V_AssetApplyReturnDetail(Objcet _row)
            {
                DataRow row = (DataRow)_row;
                V_AssetApplyReturnDetail assetApplyReturnDetail = new V_AssetApplyReturnDetail(); 
                assetApplyReturnDetail.ID = Convert.ToInt32(row[AssetBorrowReturnDetail.IDColumn]); 
                assetApplyReturnDetail.AssetID = Convert.ToInt32(row[AssetBorrowReturnDetail.AssetIDColumn]); 
                assetApplyReturnDetail.ApplyID = Convert.ToInt32(row[AssetBorrowReturnDetail.ApplyIDColumn]); 
                assetApplyReturnDetail.Code = row[Asset.CodeColumn].ToString();             return assetApplyReturnDetail; 
            }  
      

  9.   

    其实之前我主要的问题还是在与那个泛型方法里面执行强制转换的时候,不可以将一个datarow显示转成泛型类,就是o = (T)row;这条转换语句不可以,因为在泛型约束里面不可以定义约束 T已经实现强制转换。但是在具体的对象里面是可以的,如:V_AssetApplyReturnDetail detail=(V_AssetApplyReturnDetail)row,这样是可以的。因为这个对象我已经实现了强制转换,如果执行这条语句,他会调用public static explicit operator V_AssetApplyReturnDetail(DataRow row) 这个方法。但是在泛型方法里面不可以,因为我们没有办法定义那个泛型约束,告诉系统说这个泛型是实现了泛型约束。这个我们没有办法,所以有那个报错。