动态生成类

2007年11月09日 星期五 下午 05:06

最近在写一点东西,完成之后,我想把它优化一下,其中有一个方法是这样的:

传入一个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之前做起来确实有很大的困难.不错..,记一下.

posted @ 2008-02-01 10:40  point.deng  阅读(250)  评论(0编辑  收藏  举报