强弱之争
Posted Timeless
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了强弱之争相关的知识,希望对你有一定的参考价值。
在编程过程中常常会遇到这样一些困扰:
场景: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不适合用在性能要求高的场景,另外动态类型无法享受智能提示.
以上是关于强弱之争的主要内容,如果未能解决你的问题,请参考以下文章