强弱之争

在编程过程中常常会遇到这样一些困扰:

场景:domain实体A具有属性(B,C,D,E),那么我们建实体A的Class具有属性B,C,D,E.但是对于不同角色A的表现形式可能不一样,在财务看来可能需要B,C,D,E,F属性(F为计算属性),在生产需要B,C,D,E,G属性(G为XX属性),在销售看来需要B,C,D,E,H属性(H为XX属性).

我们经常需要创建类A1(B,C,D,E,F),A2(B,C,D,E,G),A3(B,C,D,E,H),A1,A2,A3均继承自A类.

还有一类需求,有时候我们只需要A的属性B,C或者B,D等,相当于A的属性的一个投影.

解决方案有:

        1.建视图,建实体与之对应.

        2.A实体转化为A1,A2,A3,类对于投影实体A转化为AT1(B,C),AT2(B,D).

        3.A实体用Linq转化为匿名实体类

不管如何处理,必须有实体转化的麻烦(循环赋值,A1,A2,A3可以as为A,但是A无法直接转化为A1,A2,A3,投影实体两者之间就更加无法转化了),而且实体类型的增加.

在数据库访问层面要转化为实体类型,要么自己写转化方法,要么利用反射动态转.

为什么我要推荐http:smartobject.codeplex.com呢?优势显而易见!

1.SmartObject的属性非常易于扩展,直接dynamic d=new SmartObject();d.属性=value或d["属性"]=value就增加了一个属性

2.对json序列化(d.ToJson(),对于List<SmartObject>使用SmartJosnSerializer.Serialize(list))和反序列化(SmartObject.Parse("JSON字符串")单个类型或SmartJosnSerializer.Deserialize("JSON字符串")反序列化列表类型)支持良好

3.提供了属性和索引访问方式(json.net反序列化为JObject只能是obj[prop].ToObject<T>(),这一步显然需要额外的开销运算,这样访问方式很不优雅)

4.反序列化之后的类型准确(你会发现json.net反序列化后类型不精确)

5.DataTable,IDataReader转化为List对象具有通用快速转化方法可以简单实现:

public static IList<dynamic> ToList(this DataTable datatable)
        {
            List<dynamic> list = new List<dynamic>();
            if ((datatable.Rows != null) && (datatable.Rows.Count > 0))
            {
                DataColumnCollection columns = datatable.Columns;
                for (int i = 0; i < datatable.Rows.Count; i++)
                {
                    dynamic obj2 = new SmartObject();
                    DataRow row = datatable.Rows[i];
                    for (int j = 0; j < columns.Count; j++)
                    {
                        string columnName = columns[j].ColumnName;
                        object obj3 = row[j];
                        obj2[columnName] = (obj3 == DBNull.Value) ? null : obj3;
                    }
                    list.Add(obj2);
                }
            }
            return list;
        }

        public static IList<dynamic> ToList(this IDataReader reader)
        {
            List<dynamic> list = new List<dynamic>();
            if (!reader.IsClosed)
            {
                using (reader)
                {
                    while (reader.Read())
                    {
                        dynamic obj2 = new SmartObject();
                        for (int i = 0; i < reader.FieldCount; i++)
                        {
                            string name = reader.GetName(i);
                            object obj3 = reader.GetValue(i);
                            obj2[name] = (obj3 == DBNull.Value) ? null : obj3;
                        }
                        list.Add(obj2);
                    }
                }
            }
            return list;
        }

        public static IList<dynamic> ToList(this DataTable datatable, Func<DataRow, dynamic> parser)
        {
            List<object> list = new List<object>();
            if (((datatable.Rows != null) && (datatable.Rows.Count > 0)) && (parser != null))
            {
                DataColumnCollection columns = datatable.Columns;
                for (int i = 0; i < datatable.Rows.Count; i++)
                {
                    list.Add(parser(datatable.Rows[i]));
                }
            }
            return list;
        }

        public static IList<dynamic> ToList(this IDataReader reader, Func<IDataReader, dynamic> parser)
        {
            List<dynamic> list = new List<dynamic>();
            if (!reader.IsClosed && (parser != null))
            {
                using (reader)
                {
                    while (reader.Read())
                    {
                        list.Add(parser(reader));
                    }
                }
            }
            return list;
        }
    }

 SmartObject不适合用在性能要求高的场景,另外动态类型无法享受智能提示.

原文地址:https://www.cnblogs.com/kingge/p/4510867.html