最近在写一点东西,完成之后,我想把它优化一下,其中有一个方法是这样的:
传入一个DataRow,生成这个对象,这个对象所包含的数据就是这一行的内容,当然这一行的数据是不确定的,对象的类型也是不确定的,先前我在做的时候是用的泛型,经过我的改进后,没有用泛型,在这里想了很久,经查找资料后,发现一个好的类,Activator类,它里面有几个有用的方法,CreateInstance可以创建出一个类的实体,正好解决了我的难题,它有几个重载,都是比较简单的,下面是我现在的代码:
public object CreateObject(DataRow row)
{
Object obj = Activator.CreateInstance(type);
PropertyInfo[] infos = obj.GetType().GetProperties();
foreach (PropertyInfo info in infos)
{
EntityProperty entity = AttributesFactory.GetEntityProperty(info);
switch (entity.DbType)
{
case DBLayer.Enums.DbType.Bool:
info.SetValue(obj, Convert.ToBoolean(row[entity.Colomn]), null);
break;
case DBLayer.Enums.DbType.DataTime:
info.SetValue(obj, Convert.ToDateTime(row[entity.Colomn]), null);
break;
case DBLayer.Enums.DbType.Double:
info.SetValue(obj, Convert.ToDouble(row[entity.Colomn]), null);
break;
case DBLayer.Enums.DbType.Enum:
case DBLayer.Enums.DbType.Int32:
info.SetValue(obj, Convert.ToInt32(row[entity.Colomn]), null);
break;
case DBLayer.Enums.DbType.String:
if (!String.IsNullOrEmpty(row[entity.Colomn].ToString()))
{
info.SetValue(obj, row[entity.Colomn].ToString(), null);
}
else
{
info.SetValue(obj, "", null);
}
break;
}
}
return obj;
}
在不知道Activator之前做起来确实有很大的困难.不错..,记一下.