1.BaseEntityHelper 解析实体类特性
代码
1 /**
2 *
3 * 2009-4-17
4 *
5 *
6 * 字段的特性
7 * */
8 using System;
9 using System.Collections.Generic;
10 using System.Linq;
11 using System.Text;
12 using System.Reflection;
13 using CommonData.Model;
14
15 namespace CommonData.Data
16 {
17 public abstract class BaseEntityHelper
18 {
19 /// <summary>
20 /// 根据反射类型获得相应实体的特性
21 /// </summary>
22 /// <param name="type">实体类型</param>
23 /// <returns></returns>
24 public TableInfo GetTableInfo(Type type)
25 {
26 TableInfo info = EntityTypeCache.Get(type);
27 if (info == null)
28 {
29 //获得表类型的特性集合
30 TableAttribute[] tableAttribute = type.GetCustomAttributes(typeof(TableAttribute),false) as TableAttribute[];
31 //获得列类型的特性集合
32 List<ColumnAttribute> listColumnAttribute = new List<ColumnAttribute>();
33 //获得主表类型的特性集合
34 List<LinkTableAttribute> listLinkTableAttribute = new List<LinkTableAttribute>();
35 //获得子表类型的特性集合
36 List<LinkTablesAttribute> listLinktablesAttribute = new List<LinkTablesAttribute>();
37
38 //获得该类型实体的所有属性
39 PropertyInfo[] propertyInfo = type.GetProperties();
40
41 foreach (PropertyInfo property in propertyInfo)
42 {
43 //ColumnAttribute[] columnAttribute = property.GetCustomAttributes(typeof(ColumnAttribute), false) as ColumnAttribute[];
44 //LinkTableAttribute[] linkTableAttribute = property.GetCustomAttributes(typeof(LinkTableAttribute),false) as LinkTableAttribute[];
45 //LinkTablesAttribute[] linkTablesAttribute = property.GetCustomAttributes(typeof(LinkTablesAttribute), false) as LinkTablesAttribute[];
46
47 //if (columnAttribute.Length > 0)
48 //{
49 // listColumnAttribute.Add(columnAttribute[0]);
50 //}
51 //if (linkTableAttribute.Length > 0)
52 //{
53 // listLinkTableAttribute.Add(listLinkTableAttribute[0]);
54 //}
55 //if (linkTablesAttribute.Length > 0)
56 //{
57 // listLinktablesAttribute.Add(linkTablesAttribute[0]);
58 //}
59 if (property.GetCustomAttributes(typeof(ColumnAttribute), false).Length > 0)
60 {
61 listColumnAttribute.Add(property.GetCustomAttributes(typeof(ColumnAttribute),false)[0] as ColumnAttribute);
62 }
63 if (property.GetCustomAttributes(typeof(LinkTableAttribute), false).Length > 0)
64 {
65 listLinkTableAttribute.Add(property.GetCustomAttributes(typeof(LinkTableAttribute),false)[0] as LinkTableAttribute);
66 }
67 if (property.GetCustomAttributes(typeof(LinkTablesAttribute), false).Length > 0)
68 {
69 listLinktablesAttribute.Add(property.GetCustomAttributes(typeof(LinkTablesAttribute),false)[0] as LinkTablesAttribute);
70 }
71 }
72
73 info = new TableInfo();
74 info.Table = tableAttribute[0];
75 info.Columns = listColumnAttribute.ToArray();
76 info.LinkTable = listLinkTableAttribute.ToArray();
77 info.LinkTables = listLinktablesAttribute.ToArray();
78 info.Properties = propertyInfo;
79 EntityTypeCache.InsertTableInfo(type,info);
80 }
81 return info;
82 }
83
84
85 /// <summary>
86 /// 根据实体公共父接口获得特性信息
87 /// </summary>
88 /// <param name="entity">公共接口对象</param>
89 /// <returns></returns>
90 public TableInfo GetTableInfo(IEntity entity)
91 {
92 return GetTableInfo(entity.GetType());
93 }
94
95 /// <summary>
96 /// 根据实体类型获得表的特性信息
97 /// </summary>
98 /// <returns></returns>
99 public TableInfo GetTableInfo<T>()
100 {
101 Type type=typeof(T);
102 return GetTableInfo(type);
103 }
104
105 /// <summary>
106 /// 更具实体公共接口获得列类型特新信息
107 /// </summary>
108 /// <param name="entity">公共实体接口</param>
109 /// <returns></returns>
110 public ColumnAttribute[] GetColumnAttribute(IEntity entity)
111 {
112 return GetTableInfo(entity).Columns;
113 }
114
115 /// <summary>
116 /// 更具实体类型获得列类特性信息
117 /// </summary>
118 /// <param name="type">实体类类型</param>
119 /// <returns></returns>
120 public ColumnAttribute[] GetColumnAttribute(Type type)
121 {
122 return GetTableInfo(type).Columns;
123 }
124
125 /// <summary>
126 /// 更具泛型类型获得列类型特性信息
127 /// </summary>
128 /// <typeparam name="T">泛型类型</typeparam>
129 /// <returns></returns>
130 public ColumnAttribute[] GetColumnAttribute<T>()
131 {
132 return GetTableInfo<T>().Columns;
133 }
134
135 /// <summary>
136 /// 更具实体公共接口获得主表类型特性信息
137 /// </summary>
138 /// <param name="entity">公共实体接口</param>
139 /// <returns></returns>
140 public LinkTableAttribute[] GetLinkTableAttribute(IEntity entity)
141 {
142 return GetTableInfo(entity).LinkTable;
143 }
144
145 /// <summary>
146 /// 更具实体类型获得主表特性信息
147 /// </summary>
148 /// <param name="type">实体类型</param>
149 /// <returns></returns>
150 public LinkTableAttribute[] GetLinkTableAttribute(Type type)
151 {
152 return GetTableInfo(type).LinkTable;
153 }
154
155 /// <summary>
156 /// 更具泛型类型获得主表类型特性信息
157 /// </summary>
158 /// <typeparam name="T">泛型类型</typeparam>
159 /// <returns></returns>
160 public LinkTableAttribute[] GetLinkTableAttribute<T>()
161 {
162 return GetTableInfo<T>().LinkTable;
163 }
164
165 /// <summary>
166 /// 更具实体公共接口来获得子表类型特性信息
167 /// </summary>
168 /// <param name="entity">公共接口</param>
169 /// <returns></returns>
170 public LinkTablesAttribute[] GetLinkTablesAttribute(IEntity entity)
171 {
172 return GetTableInfo(entity).LinkTables;
173 }
174
175
176 /// <summary>
177 /// 更具实体类型获得子表类型特性信息
178 /// </summary>
179 /// <param name="type">实体类型</param>
180 /// <returns></returns>
181 public LinkTablesAttribute[] GetLinkTablesAttribute(Type type)
182 {
183 return GetTableInfo(type).LinkTables;
184 }
185
186 /// <summary>
187 /// 更具泛型获得子表类型特性信息
188 /// </summary>
189 /// <typeparam name="T">泛型类型</typeparam>
190 /// <returns></returns>
191 public LinkTablesAttribute[] GetLinkTablesAttribute<T>()
192 {
193 return GetTableInfo<T>().LinkTables;
194 }
195
196 /// <summary>
197 /// 根据共同实体接口获得表特性信息
198 /// </summary>
199 /// <param name="entity">公共实体接口</param>
200 /// <returns></returns>
201 public TableAttribute GetTableAttribute(IEntity entity)
202 {
203 return GetTableInfo(entity).Table;
204 }
205
206 /// <summary>
207 /// 根据实体类型获得实体特性信息
208 /// </summary>
209 /// <param name="type">实体类型</param>
210 /// <returns></returns>
211 public TableAttribute GetTableAttribute(Type type)
212 {
213 return GetTableInfo(type).Table;
214 }
215
216 /// <summary>
217 /// 根据泛型类型获得实体特性信息
218 /// </summary>
219 /// <typeparam name="T">泛型类型</typeparam>
220 /// <returns></returns>
221 public TableAttribute GetTableAttribute<T>()
222 {
223 return GetTableInfo<T>().Table;
224 }
225
226 }
227 }
228
BaseEntityHelper 这个类主要是为了解析实体类的特性信息。 public TableInfo GetTableInfo(Type type) 这个方法这个类中的核心,我们从Type 类型可以获得该类型的所有属性,方法和特性信息,同时我们也可以动态的从这个实体类中获得属性的值或者为这个属性赋值。反射可以保证我们在不知道实体相关信息的情况下获得实体的数据信息。这也是后面再组装sql语句赋值的核心
同时这个类中大量重载了一小儿方法,包括泛型的重载方法。目的是为了体现程序的灵活性。
2.拓展类 DataExtension
代码
1 /**
2 *
3 * 2009-4-17
4 *
5 *
6 * 拓展方法,用于添加参数
7 * */
8 using System;
9 using System.Collections.Generic;
10 using System.Linq;
11 using System.Text;
12 using System.Data;
13
14 namespace CommonData.Data
15 {
16 public static class DataExtension
17 {
18 /// <summary>
19 /// 拓展方法,用于给执行语句添加参数
20 /// </summary>
21 /// <param name="paramenters">参数集合列表</param>
22 /// <param name="param">传递的参数值集合</param>
23 public static void AddRange(this IDataParameterCollection paramenters, params IDataParameter[] param)
24 {
25 if (param != null)
26 {
27 foreach (IDbDataParameter p in param)
28 {
29 paramenters.Add(p);
30 }
31 }
32 }
33 }
34 }
35
这个类拓展了一个借口IDataParameterCollection,.net 中的拓展方法可以说为.net 平台注入了新的血液,让程序更加生动和富有色彩。扩展方法不仅可以或者自己定义的类中的方法,而且可以更具需要扩展系统中的方法。其中这个类中的AddRange 方法是一个很好的例子,扩展了IDataParamterCollection 这个接口中的方法。扩展这份方法可以将占位符中的变量一次性赋值,而不用每次都去循环赋值。
其实SqlParamters 这个类中是有AddRange 这个方法的,可以一次为占位符添加数组和集合,但是现在这个是它的父接口,没有提供这样的方法,因此我们扩展了这个方法。还要说明的是 这里使用接口而没有直接使用SqlParameters 这个类是因为当程序需要扩展的时候,我们不局限于sql数据库(可能是Oracle 数据库),我们只需要实现相应的接口即可,实现的过程可以任意调整,这样程序才具有灵活性。本人写的这个只是实现了sql server 数据