在我的实际对象像中,我已经实现将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;
}
{
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;
}
解决方案 »
- 【高分求解】如何用EmguCV的Surf算法?
- winform image属性问题
- 我想实现的效果:地图上点击一个省,该省背景突出显示!!!!!
- C#一个类中静态(static)方法和动态方法有什么就区别了?
- 如何设置webBrowser1.Document.Domain?
- VS中,C#和VB的一点不同……很迷惑。。。
- 怎样用程序关闭COM+组件服务
- 求指点,c#循环读取xml节点
- 怎样从DataGrid选中的行中,读取数据
- 算法问题!高分求一排列组合算法。(100分)
- 一个关于AppDomain类的问题,请教一下大家
- 无法将类型“System.Data.SqlClient.SqlDataReader”隐式转换为“System.Data.SqlClient.SqlDataAd
谢谢青qldsrx(龙白虎)的回复,接口可能不行,我的对象里面的属性是不同的。没有办法让多个对象都继承某个接口,因为他们都有属于自己的属性
{
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;
}
谢谢你的回复,我明白你的意思,你是在一个泛型类里面,利用反射的方法来构建这个方法,其实这个方法也是可以实现我要的功能,但是性能可能存在问题。如果datatable里的行数很多,而且泛型实例的属性很多的话,那性能可能存在问题。其实我的方法只是在将某行转换为具体对象时,我是希望能够在该对象的显示转换方法里面去执行,这样不用遍历该对象的属性,性能会好一点,但是泛型的约束里面好像不能把这个转换的约束包含进来,我估计应该是不可以。因为显示约束是一个静态的方法。
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;
}
提供一个泛型的接口,用来将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(青龙白虎),让我想法接口。
兄弟,我的泛型里面其实就是一个具体的实体对象,就是对应于表的对像,我需要将行转换为这个实体对象。
我写这个方法的目的是,外层调用需要某个对象的集合时,不需要在每个对象里面去将一个dataset转为一个list对象集合,我希望都是调用这个方法,去实现,但是一个具体的datarow对象如何去变成一个实体对象就在该对象的里去实现。因为毕竟dataset里面的是对应不同的表。所以需要各自自己去实现将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;
}