Mercurial > pub > bltoolkit
comparison Source/Data/Linq/ReflectionHelper.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children | 1ef98bd70424 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f990fcb411a9 |
---|---|
1 using System; | |
2 using System.Collections.Generic; | |
3 using System.Collections.ObjectModel; | |
4 using System.Data; | |
5 using System.Data.SqlTypes; | |
6 using System.IO; | |
7 using System.Linq; | |
8 using System.Linq.Expressions; | |
9 using System.Reflection; | |
10 using System.Xml; | |
11 #if !SILVERLIGHT | |
12 using System.Xml.Linq; | |
13 #endif | |
14 | |
15 using LinqBinary = System.Data.Linq.Binary; | |
16 using BLToolkit.Reflection; | |
17 | |
18 namespace BLToolkit.Data.Linq | |
19 { | |
20 public class ReflectionHelper | |
21 { | |
22 public class Expressor<T> | |
23 { | |
24 public static FieldInfo FieldExpressor(Expression<Func<T,object>> func) | |
25 { | |
26 return (FieldInfo)((MemberExpression)((UnaryExpression)func.Body).Operand).Member; | |
27 } | |
28 | |
29 public static MethodInfo PropertyExpressor(Expression<Func<T,object>> func) | |
30 { | |
31 return ((PropertyInfo)((MemberExpression)func.Body).Member).GetGetMethod(); | |
32 } | |
33 | |
34 public static MethodInfo MethodExpressor(Expression<Func<T,object>> func) | |
35 { | |
36 var ex = func.Body; | |
37 | |
38 if (ex is UnaryExpression) | |
39 ex = ((UnaryExpression)ex).Operand; | |
40 | |
41 //if (ex is MemberExpression) | |
42 // return ((PropertyInfo)((MemberExpression)ex).Member).GetGetMethod(); | |
43 | |
44 return ((MethodCallExpression)ex).Method; | |
45 } | |
46 } | |
47 | |
48 public static MemberInfo MemeberInfo(LambdaExpression func) | |
49 { | |
50 var ex = func.Body; | |
51 | |
52 if (ex is UnaryExpression) | |
53 ex = ((UnaryExpression)ex).Operand; | |
54 | |
55 return | |
56 ex is MemberExpression ? ((MemberExpression) ex).Member : | |
57 ex is MethodCallExpression ? ((MethodCallExpression)ex).Method : | |
58 (MemberInfo)((NewExpression) ex).Constructor; | |
59 } | |
60 | |
61 public class Binary : Expressor<BinaryExpression> | |
62 { | |
63 public static MethodInfo Conversion = PropertyExpressor(e => e.Conversion); | |
64 public static MethodInfo Left = PropertyExpressor(e => e.Left); | |
65 public static MethodInfo Right = PropertyExpressor(e => e.Right); | |
66 } | |
67 | |
68 public class Unary : Expressor<UnaryExpression> | |
69 { | |
70 public static MethodInfo Operand = PropertyExpressor(e => e.Operand); | |
71 } | |
72 | |
73 public class LambdaExpr : Expressor<LambdaExpression> | |
74 { | |
75 public static MethodInfo Body = PropertyExpressor(e => e.Body); | |
76 public static MethodInfo Parameters = PropertyExpressor(e => e.Parameters); | |
77 } | |
78 | |
79 public class Constant : Expressor<ConstantExpression> | |
80 { | |
81 public static MethodInfo Value = PropertyExpressor(e => e.Value); | |
82 } | |
83 | |
84 public class QueryableInt : Expressor<IQueryable> | |
85 { | |
86 public static MethodInfo Expression = PropertyExpressor(e => e.Expression); | |
87 } | |
88 | |
89 public class MethodCall : Expressor<MethodCallExpression> | |
90 { | |
91 public static MethodInfo Object = PropertyExpressor(e => e.Object); | |
92 public static MethodInfo Arguments = PropertyExpressor(e => e.Arguments); | |
93 } | |
94 | |
95 public class Conditional : Expressor<ConditionalExpression> | |
96 { | |
97 public static MethodInfo Test = PropertyExpressor(e => e.Test); | |
98 public static MethodInfo IfTrue = PropertyExpressor(e => e.IfTrue); | |
99 public static MethodInfo IfFalse = PropertyExpressor(e => e.IfFalse); | |
100 } | |
101 | |
102 public class Invocation : Expressor<InvocationExpression> | |
103 { | |
104 public static MethodInfo Expression = PropertyExpressor(e => e.Expression); | |
105 public static MethodInfo Arguments = PropertyExpressor(e => e.Arguments); | |
106 } | |
107 | |
108 public class ListInit : Expressor<ListInitExpression> | |
109 { | |
110 public static MethodInfo NewExpression = PropertyExpressor(e => e.NewExpression); | |
111 public static MethodInfo Initializers = PropertyExpressor(e => e.Initializers); | |
112 } | |
113 | |
114 public class ElementInit : Expressor<System.Linq.Expressions.ElementInit> | |
115 { | |
116 public static MethodInfo Arguments = PropertyExpressor(e => e.Arguments); | |
117 } | |
118 | |
119 public class Member : Expressor<MemberExpression> | |
120 { | |
121 public static MethodInfo Expression = PropertyExpressor(e => e.Expression); | |
122 } | |
123 | |
124 public class MemberInit : Expressor<MemberInitExpression> | |
125 { | |
126 public static MethodInfo NewExpression = PropertyExpressor(e => e.NewExpression); | |
127 public static MethodInfo Bindings = PropertyExpressor(e => e.Bindings); | |
128 } | |
129 | |
130 public class New : Expressor<NewExpression> | |
131 { | |
132 public static MethodInfo Arguments = PropertyExpressor(e => e.Arguments); | |
133 } | |
134 | |
135 public class NewArray : Expressor<NewArrayExpression> | |
136 { | |
137 public static MethodInfo Expressions = PropertyExpressor(e => e.Expressions); | |
138 } | |
139 | |
140 public class TypeBinary : Expressor<TypeBinaryExpression> | |
141 { | |
142 public static MethodInfo Expression = PropertyExpressor(e => e.Expression); | |
143 } | |
144 | |
145 public class IndexExpressor<T> | |
146 { | |
147 public static MethodInfo IndexerExpressor(Expression<Func<ReadOnlyCollection<T>, object>> func) | |
148 { | |
149 return ((MethodCallExpression)((UnaryExpression)func.Body).Operand).Method; | |
150 } | |
151 | |
152 public static MethodInfo Item = IndexerExpressor(c => c[0]); | |
153 } | |
154 | |
155 public class MemberAssignmentBind : Expressor<MemberAssignment> | |
156 { | |
157 public static MethodInfo Expression = PropertyExpressor(e => e.Expression); | |
158 } | |
159 | |
160 public class MemberListBind : Expressor<MemberListBinding> | |
161 { | |
162 public static MethodInfo Initializers = PropertyExpressor(e => e.Initializers); | |
163 } | |
164 | |
165 public class MemberMemberBind : Expressor<MemberMemberBinding> | |
166 { | |
167 public static MethodInfo Bindings = PropertyExpressor(e => e.Bindings); | |
168 } | |
169 | |
170 #if FW4 || SILVERLIGHT | |
171 | |
172 public class Block : Expressor<BlockExpression> | |
173 { | |
174 public static MethodInfo Expressions = PropertyExpressor(e => e.Expressions); | |
175 public static MethodInfo Variables = PropertyExpressor(e => e.Variables); | |
176 } | |
177 | |
178 #endif | |
179 | |
180 public static MethodInfo ExprItem = IndexExpressor<Expression> .Item; | |
181 public static MethodInfo ParamItem = IndexExpressor<ParameterExpression>.Item; | |
182 public static MethodInfo ElemItem = IndexExpressor<ElementInit> .Item; | |
183 | |
184 public class DataReader : Expressor<IDataReader> | |
185 { | |
186 public static MethodInfo GetValue = MethodExpressor(rd => rd.GetValue(0)); | |
187 public static MethodInfo IsDBNull = MethodExpressor(rd => rd.IsDBNull(0)); | |
188 } | |
189 | |
190 internal class QueryCtx : Expressor<QueryContext> | |
191 { | |
192 public static FieldInfo Counter = FieldExpressor(ctx => ctx.Counter); | |
193 } | |
194 | |
195 public class MapSchema : Expressor<Mapping.MappingSchema> | |
196 { | |
197 public static MethodInfo MapValueToEnum = MethodExpressor(m => m.MapValueToEnum(null, (Type)null)); | |
198 public static MethodInfo MapValueToEnumWithMemberAccessor = MethodExpressor(m => m.MapValueToEnum(null, (MemberAccessor)null)); | |
199 public static MethodInfo ChangeType = MethodExpressor(m => m.ConvertChangeType(null, null)); | |
200 | |
201 public static Dictionary<Type,MethodInfo> Converters = new Dictionary<Type,MethodInfo> | |
202 { | |
203 // Primitive Types | |
204 // | |
205 { typeof(SByte), MethodExpressor(m => m.ConvertToSByte (null)) }, | |
206 { typeof(Int16), MethodExpressor(m => m.ConvertToInt16 (null)) }, | |
207 { typeof(Int32), MethodExpressor(m => m.ConvertToInt32 (null)) }, | |
208 { typeof(Int64), MethodExpressor(m => m.ConvertToInt64 (null)) }, | |
209 { typeof(Byte), MethodExpressor(m => m.ConvertToByte (null)) }, | |
210 { typeof(UInt16), MethodExpressor(m => m.ConvertToUInt16 (null)) }, | |
211 { typeof(UInt32), MethodExpressor(m => m.ConvertToUInt32 (null)) }, | |
212 { typeof(UInt64), MethodExpressor(m => m.ConvertToUInt64 (null)) }, | |
213 { typeof(Char), MethodExpressor(m => m.ConvertToChar (null)) }, | |
214 { typeof(Single), MethodExpressor(m => m.ConvertToSingle (null)) }, | |
215 { typeof(Double), MethodExpressor(m => m.ConvertToDouble (null)) }, | |
216 { typeof(Boolean), MethodExpressor(m => m.ConvertToBoolean (null)) }, | |
217 | |
218 // Simple Types | |
219 // | |
220 { typeof(String), MethodExpressor(m => m.ConvertToString (null)) }, | |
221 { typeof(DateTime), MethodExpressor(m => m.ConvertToDateTime (null)) }, | |
222 { typeof(TimeSpan), MethodExpressor(m => m.ConvertToTimeSpan (null)) }, | |
223 { typeof(DateTimeOffset), MethodExpressor(m => m.ConvertToDateTimeOffset (null)) }, | |
224 { typeof(Decimal), MethodExpressor(m => m.ConvertToDecimal (null)) }, | |
225 { typeof(Guid), MethodExpressor(m => m.ConvertToGuid (null)) }, | |
226 { typeof(Stream), MethodExpressor(m => m.ConvertToStream (null)) }, | |
227 #if !SILVERLIGHT | |
228 { typeof(XmlReader), MethodExpressor(m => m.ConvertToXmlReader (null)) }, | |
229 { typeof(XmlDocument), MethodExpressor(m => m.ConvertToXmlDocument (null)) }, | |
230 { typeof(XElement), MethodExpressor(m => m.ConvertToXElement (null)) }, | |
231 #endif | |
232 { typeof(Byte[]), MethodExpressor(m => m.ConvertToByteArray (null)) }, | |
233 { typeof(LinqBinary), MethodExpressor(m => m.ConvertToLinqBinary (null)) }, | |
234 { typeof(Char[]), MethodExpressor(m => m.ConvertToCharArray (null)) }, | |
235 | |
236 // Nullable Types | |
237 // | |
238 { typeof(SByte?), MethodExpressor(m => m.ConvertToNullableSByte (null)) }, | |
239 { typeof(Int16?), MethodExpressor(m => m.ConvertToNullableInt16 (null)) }, | |
240 { typeof(Int32?), MethodExpressor(m => m.ConvertToNullableInt32 (null)) }, | |
241 { typeof(Int64?), MethodExpressor(m => m.ConvertToNullableInt64 (null)) }, | |
242 { typeof(Byte?), MethodExpressor(m => m.ConvertToNullableByte (null)) }, | |
243 { typeof(UInt16?), MethodExpressor(m => m.ConvertToNullableUInt16 (null)) }, | |
244 { typeof(UInt32?), MethodExpressor(m => m.ConvertToNullableUInt32 (null)) }, | |
245 { typeof(UInt64?), MethodExpressor(m => m.ConvertToNullableUInt64 (null)) }, | |
246 { typeof(Char?), MethodExpressor(m => m.ConvertToNullableChar (null)) }, | |
247 { typeof(Double?), MethodExpressor(m => m.ConvertToNullableDouble (null)) }, | |
248 { typeof(Single?), MethodExpressor(m => m.ConvertToNullableSingle (null)) }, | |
249 { typeof(Boolean?), MethodExpressor(m => m.ConvertToNullableBoolean (null)) }, | |
250 { typeof(DateTime?), MethodExpressor(m => m.ConvertToNullableDateTime (null)) }, | |
251 { typeof(TimeSpan?), MethodExpressor(m => m.ConvertToNullableTimeSpan (null)) }, | |
252 { typeof(DateTimeOffset?), MethodExpressor(m => m.ConvertToNullableDateTimeOffset(null)) }, | |
253 { typeof(Decimal?), MethodExpressor(m => m.ConvertToNullableDecimal (null)) }, | |
254 { typeof(Guid?), MethodExpressor(m => m.ConvertToNullableGuid (null)) }, | |
255 | |
256 #if !SILVERLIGHT | |
257 | |
258 // SqlTypes | |
259 // | |
260 { typeof(SqlByte), MethodExpressor(m => m.ConvertToSqlByte (null)) }, | |
261 { typeof(SqlInt16), MethodExpressor(m => m.ConvertToSqlInt16 (null)) }, | |
262 { typeof(SqlInt32), MethodExpressor(m => m.ConvertToSqlInt32 (null)) }, | |
263 { typeof(SqlInt64), MethodExpressor(m => m.ConvertToSqlInt64 (null)) }, | |
264 { typeof(SqlSingle), MethodExpressor(m => m.ConvertToSqlSingle (null)) }, | |
265 { typeof(SqlBoolean), MethodExpressor(m => m.ConvertToSqlBoolean (null)) }, | |
266 { typeof(SqlDouble), MethodExpressor(m => m.ConvertToSqlDouble (null)) }, | |
267 { typeof(SqlDateTime), MethodExpressor(m => m.ConvertToSqlDateTime (null)) }, | |
268 { typeof(SqlDecimal), MethodExpressor(m => m.ConvertToSqlDecimal (null)) }, | |
269 { typeof(SqlMoney), MethodExpressor(m => m.ConvertToSqlMoney (null)) }, | |
270 { typeof(SqlString), MethodExpressor(m => m.ConvertToSqlString (null)) }, | |
271 { typeof(SqlBinary), MethodExpressor(m => m.ConvertToSqlBinary (null)) }, | |
272 { typeof(SqlGuid), MethodExpressor(m => m.ConvertToSqlGuid (null)) }, | |
273 { typeof(SqlBytes), MethodExpressor(m => m.ConvertToSqlBytes (null)) }, | |
274 { typeof(SqlChars), MethodExpressor(m => m.ConvertToSqlChars (null)) }, | |
275 { typeof(SqlXml), MethodExpressor(m => m.ConvertToSqlXml (null)) }, | |
276 | |
277 #endif | |
278 }; | |
279 } | |
280 | |
281 public class Functions | |
282 { | |
283 public class String : Expressor<string> | |
284 { | |
285 //public static MethodInfo Contains = MethodExpressor(s => s.Contains("")); | |
286 //public static MethodInfo StartsWith = MethodExpressor(s => s.StartsWith("")); | |
287 //public static MethodInfo EndsWith = MethodExpressor(s => s.EndsWith("")); | |
288 | |
289 #if !SILVERLIGHT | |
290 public static MethodInfo Like11 = MethodExpressor(s => System.Data.Linq.SqlClient.SqlMethods.Like("", "")); | |
291 public static MethodInfo Like12 = MethodExpressor(s => System.Data.Linq.SqlClient.SqlMethods.Like("", "", ' ')); | |
292 #endif | |
293 | |
294 public static MethodInfo Like21 = MethodExpressor(s => Sql.Like(s, "")); | |
295 public static MethodInfo Like22 = MethodExpressor(s => Sql.Like(s, "", ' ')); | |
296 } | |
297 } | |
298 } | |
299 } |