0
|
1 using System;
|
|
2 using System.Data.SqlTypes;
|
|
3 using System.Linq.Expressions;
|
|
4 using System.Reflection;
|
|
5 using System.ComponentModel;
|
|
6 using BLToolkit.Data.Linq;
|
|
7
|
|
8 #if !SILVERLIGHT && !DATA
|
|
9 using BLToolkit.ComponentModel;
|
|
10 #endif
|
|
11
|
|
12 namespace BLToolkit.Reflection
|
|
13 {
|
|
14 public abstract class MemberAccessor
|
|
15 {
|
|
16 protected MemberAccessor(TypeAccessor typeAccessor, MemberInfo memberInfo)
|
|
17 {
|
|
18 TypeAccessor = typeAccessor;
|
|
19 MemberInfo = memberInfo;
|
|
20 }
|
|
21
|
|
22 #region Public Properties
|
|
23
|
|
24 public MemberInfo MemberInfo { get; private set; }
|
|
25 public TypeAccessor TypeAccessor { get; private set; }
|
|
26
|
|
27 #if !SILVERLIGHT && !DATA
|
|
28
|
|
29 private PropertyDescriptor _propertyDescriptor;
|
|
30 public PropertyDescriptor PropertyDescriptor
|
|
31 {
|
|
32 get
|
|
33 {
|
|
34 if (_propertyDescriptor == null)
|
|
35 _propertyDescriptor = new MemberPropertyDescriptor(TypeAccessor.OriginalType, Name);
|
|
36
|
|
37 return _propertyDescriptor;
|
|
38 }
|
|
39 }
|
|
40
|
|
41 #endif
|
|
42
|
|
43 public virtual bool HasGetter { get { return false; } }
|
|
44 public virtual bool HasSetter { get { return false; } }
|
|
45
|
|
46 public Type Type
|
|
47 {
|
|
48 get
|
|
49 {
|
|
50 return MemberInfo is PropertyInfo?
|
|
51 ((PropertyInfo)MemberInfo).PropertyType:
|
|
52 ((FieldInfo) MemberInfo).FieldType;
|
|
53 }
|
|
54 }
|
|
55
|
|
56 public string Name
|
|
57 {
|
|
58 get { return MemberInfo.Name; }
|
|
59 }
|
|
60
|
|
61 private Type _underlyingType;
|
|
62 public Type UnderlyingType
|
|
63 {
|
|
64 get { return _underlyingType ?? (_underlyingType = TypeHelper.GetUnderlyingType(Type)); }
|
|
65 }
|
|
66
|
|
67 #endregion
|
|
68
|
|
69 #region Public Methods
|
|
70
|
|
71 public bool IsDefined<T>() where T : Attribute
|
|
72 {
|
|
73 return MemberInfo.IsDefined(typeof(T), true);
|
|
74 }
|
|
75
|
|
76 [Obsolete("Use generic version instead")]
|
|
77 public Attribute GetAttribute(Type attributeType)
|
|
78 {
|
|
79 var attrs = MemberInfo.GetCustomAttributes(attributeType, true);
|
|
80
|
|
81 return attrs.Length > 0? (Attribute)attrs[0]: null;
|
|
82 }
|
|
83
|
|
84 public T GetAttribute<T>() where T : Attribute
|
|
85 {
|
|
86 var attrs = MemberInfo.GetCustomAttributes(typeof(T), true);
|
|
87
|
|
88 return attrs.Length > 0? (T)attrs[0]: null;
|
|
89 }
|
|
90
|
|
91 [Obsolete("Use generic version instead")]
|
|
92 public object[] GetAttributes(Type attributeType)
|
|
93 {
|
|
94 var attrs = MemberInfo.GetCustomAttributes(attributeType, true);
|
|
95
|
|
96 return attrs.Length > 0? attrs: null;
|
|
97 }
|
|
98
|
|
99 public T[] GetAttributes<T>() where T : Attribute
|
|
100 {
|
|
101 Array attrs = MemberInfo.GetCustomAttributes(typeof(T), true);
|
|
102
|
|
103 return attrs.Length > 0? (T[])attrs: null;
|
|
104 }
|
|
105
|
|
106 public object[] GetAttributes()
|
|
107 {
|
|
108 var attrs = MemberInfo.GetCustomAttributes(true);
|
|
109
|
|
110 return attrs.Length > 0? attrs: null;
|
|
111 }
|
|
112
|
|
113 public object[] GetTypeAttributes(Type attributeType)
|
|
114 {
|
|
115 return TypeHelper.GetAttributes(TypeAccessor.OriginalType, attributeType);
|
|
116 }
|
|
117
|
|
118 #endregion
|
|
119
|
|
120 #region Set/Get Value
|
|
121
|
|
122 public virtual Boolean IsNull(object o)
|
|
123 {
|
|
124 return true;
|
|
125 }
|
|
126
|
|
127 static object GetDefaultValue<T>()
|
|
128 {
|
|
129 return default(T);
|
|
130 }
|
|
131
|
|
132 object _defaultValue;
|
|
133
|
|
134 public virtual object GetValue(object o)
|
|
135 {
|
|
136 if (_defaultValue == null && Type.IsValueType && !TypeHelper.IsNullableType(Type))
|
|
137 {
|
|
138 var mi = ReflectionHelper.Expressor<object>.MethodExpressor(_ => GetDefaultValue<int>());
|
|
139
|
|
140 _defaultValue =
|
|
141 Expression.Lambda<Func<object>>(
|
|
142 Expression.Call(mi.GetGenericMethodDefinition().MakeGenericMethod(Type)))
|
|
143 .Compile()();
|
|
144 }
|
|
145
|
|
146 return _defaultValue;
|
|
147 }
|
|
148
|
|
149 public virtual void SetValue(object o, object value)
|
|
150 {
|
|
151 }
|
|
152
|
|
153 public virtual void CloneValue(object source, object dest)
|
|
154 {
|
|
155 var value = GetValue(source);
|
|
156
|
|
157 SetValue(dest, value is ICloneable? ((ICloneable)value).Clone(): value);
|
|
158 }
|
|
159
|
|
160
|
|
161 // Simple types getters.
|
|
162 //
|
|
163 [CLSCompliant(false)]
|
|
164 public virtual SByte GetSByte (object o) { return (SByte) GetValue(o); }
|
|
165 public virtual Int16 GetInt16 (object o) { return (Int16) GetValue(o); }
|
|
166 public virtual Int32 GetInt32 (object o) { return (Int32) GetValue(o); }
|
|
167 public virtual Int64 GetInt64 (object o) { return (Int64) GetValue(o); }
|
|
168
|
|
169 public virtual Byte GetByte (object o) { return (Byte) GetValue(o); }
|
|
170 [CLSCompliant(false)]
|
|
171 public virtual UInt16 GetUInt16 (object o) { return (UInt16) GetValue(o); }
|
|
172 [CLSCompliant(false)]
|
|
173 public virtual UInt32 GetUInt32 (object o) { return (UInt32) GetValue(o); }
|
|
174 [CLSCompliant(false)]
|
|
175 public virtual UInt64 GetUInt64 (object o) { return (UInt64) GetValue(o); }
|
|
176
|
|
177 public virtual Boolean GetBoolean (object o) { return (Boolean) GetValue(o); }
|
|
178 public virtual Char GetChar (object o) { return (Char) GetValue(o); }
|
|
179 public virtual Single GetSingle (object o) { return (Single) GetValue(o); }
|
|
180 public virtual Double GetDouble (object o) { return (Double) GetValue(o); }
|
|
181 public virtual Decimal GetDecimal (object o) { return (Decimal) GetValue(o); }
|
|
182 public virtual Guid GetGuid (object o) { return (Guid) GetValue(o); }
|
|
183 public virtual DateTime GetDateTime(object o) { return (DateTime)GetValue(o); }
|
|
184 public virtual TimeSpan GetTimeSpan(object o) { return (TimeSpan)GetValue(o); }
|
|
185 public virtual DateTimeOffset GetDateTimeOffset(object o) { return (DateTimeOffset)GetValue(o); }
|
|
186
|
|
187 // Nullable types getters.
|
|
188 //
|
|
189 [CLSCompliant(false)]
|
|
190 public virtual SByte? GetNullableSByte (object o) { return (SByte?) GetValue(o); }
|
|
191 public virtual Int16? GetNullableInt16 (object o) { return (Int16?) GetValue(o); }
|
|
192 public virtual Int32? GetNullableInt32 (object o) { return (Int32?) GetValue(o); }
|
|
193 public virtual Int64? GetNullableInt64 (object o) { return (Int64?) GetValue(o); }
|
|
194
|
|
195 public virtual Byte? GetNullableByte (object o) { return (Byte?) GetValue(o); }
|
|
196 [CLSCompliant(false)]
|
|
197 public virtual UInt16? GetNullableUInt16 (object o) { return (UInt16?) GetValue(o); }
|
|
198 [CLSCompliant(false)]
|
|
199 public virtual UInt32? GetNullableUInt32 (object o) { return (UInt32?) GetValue(o); }
|
|
200 [CLSCompliant(false)]
|
|
201 public virtual UInt64? GetNullableUInt64 (object o) { return (UInt64?) GetValue(o); }
|
|
202
|
|
203 public virtual Boolean? GetNullableBoolean (object o) { return (Boolean?) GetValue(o); }
|
|
204 public virtual Char? GetNullableChar (object o) { return (Char?) GetValue(o); }
|
|
205 public virtual Single? GetNullableSingle (object o) { return (Single?) GetValue(o); }
|
|
206 public virtual Double? GetNullableDouble (object o) { return (Double?) GetValue(o); }
|
|
207 public virtual Decimal? GetNullableDecimal (object o) { return (Decimal?) GetValue(o); }
|
|
208 public virtual Guid? GetNullableGuid (object o) { return (Guid?) GetValue(o); }
|
|
209 public virtual DateTime? GetNullableDateTime(object o) { return (DateTime?)GetValue(o); }
|
|
210 public virtual TimeSpan? GetNullableTimeSpan(object o) { return (TimeSpan?)GetValue(o); }
|
|
211 public virtual DateTimeOffset? GetNullableDateTimeOffset(object o) { return (DateTimeOffset?)GetValue(o); }
|
|
212
|
|
213 #if !SILVERLIGHT
|
|
214
|
|
215 // SQL type getters.
|
|
216 //
|
|
217 public virtual SqlByte GetSqlByte (object o) { return (SqlByte) GetValue(o); }
|
|
218 public virtual SqlInt16 GetSqlInt16 (object o) { return (SqlInt16) GetValue(o); }
|
|
219 public virtual SqlInt32 GetSqlInt32 (object o) { return (SqlInt32) GetValue(o); }
|
|
220 public virtual SqlInt64 GetSqlInt64 (object o) { return (SqlInt64) GetValue(o); }
|
|
221 public virtual SqlSingle GetSqlSingle (object o) { return (SqlSingle) GetValue(o); }
|
|
222 public virtual SqlBoolean GetSqlBoolean (object o) { return (SqlBoolean) GetValue(o); }
|
|
223 public virtual SqlDouble GetSqlDouble (object o) { return (SqlDouble) GetValue(o); }
|
|
224 public virtual SqlDateTime GetSqlDateTime(object o) { return (SqlDateTime)GetValue(o); }
|
|
225 public virtual SqlDecimal GetSqlDecimal (object o) { return (SqlDecimal) GetValue(o); }
|
|
226 public virtual SqlMoney GetSqlMoney (object o) { return (SqlMoney) GetValue(o); }
|
|
227 public virtual SqlGuid GetSqlGuid (object o) { return (SqlGuid) GetValue(o); }
|
|
228 public virtual SqlString GetSqlString (object o) { return (SqlString) GetValue(o); }
|
|
229
|
|
230 #endif
|
|
231
|
|
232 // Simple type setters.
|
|
233 //
|
|
234 [CLSCompliant(false)]
|
|
235 public virtual void SetSByte (object o, SByte value) { SetValue(o, value); }
|
|
236 public virtual void SetInt16 (object o, Int16 value) { SetValue(o, value); }
|
|
237 public virtual void SetInt32 (object o, Int32 value) { SetValue(o, value); }
|
|
238 public virtual void SetInt64 (object o, Int64 value) { SetValue(o, value); }
|
|
239
|
|
240 public virtual void SetByte (object o, Byte value) { SetValue(o, value); }
|
|
241 [CLSCompliant(false)]
|
|
242 public virtual void SetUInt16 (object o, UInt16 value) { SetValue(o, value); }
|
|
243 [CLSCompliant(false)]
|
|
244 public virtual void SetUInt32 (object o, UInt32 value) { SetValue(o, value); }
|
|
245 [CLSCompliant(false)]
|
|
246 public virtual void SetUInt64 (object o, UInt64 value) { SetValue(o, value); }
|
|
247
|
|
248 public virtual void SetBoolean (object o, Boolean value) { SetValue(o, value); }
|
|
249 public virtual void SetChar (object o, Char value) { SetValue(o, value); }
|
|
250 public virtual void SetSingle (object o, Single value) { SetValue(o, value); }
|
|
251 public virtual void SetDouble (object o, Double value) { SetValue(o, value); }
|
|
252 public virtual void SetDecimal (object o, Decimal value) { SetValue(o, value); }
|
|
253 public virtual void SetGuid (object o, Guid value) { SetValue(o, value); }
|
|
254 public virtual void SetDateTime(object o, DateTime value) { SetValue(o, value); }
|
|
255 public virtual void SetTimeSpan(object o, TimeSpan value) { SetValue(o, value); }
|
|
256 public virtual void SetDateTimeOffset(object o, DateTimeOffset value) { SetValue(o, value); }
|
|
257
|
|
258 // Simple type setters.
|
|
259 //
|
|
260 [CLSCompliant(false)]
|
|
261 public virtual void SetNullableSByte (object o, SByte? value) { SetValue(o, value); }
|
|
262 public virtual void SetNullableInt16 (object o, Int16? value) { SetValue(o, value); }
|
|
263 public virtual void SetNullableInt32 (object o, Int32? value) { SetValue(o, value); }
|
|
264 public virtual void SetNullableInt64 (object o, Int64? value) { SetValue(o, value); }
|
|
265
|
|
266 public virtual void SetNullableByte (object o, Byte? value) { SetValue(o, value); }
|
|
267 [CLSCompliant(false)]
|
|
268 public virtual void SetNullableUInt16 (object o, UInt16? value) { SetValue(o, value); }
|
|
269 [CLSCompliant(false)]
|
|
270 public virtual void SetNullableUInt32 (object o, UInt32? value) { SetValue(o, value); }
|
|
271 [CLSCompliant(false)]
|
|
272 public virtual void SetNullableUInt64 (object o, UInt64? value) { SetValue(o, value); }
|
|
273
|
|
274 public virtual void SetNullableBoolean (object o, Boolean? value) { SetValue(o, value); }
|
|
275 public virtual void SetNullableChar (object o, Char? value) { SetValue(o, value); }
|
|
276 public virtual void SetNullableSingle (object o, Single? value) { SetValue(o, value); }
|
|
277 public virtual void SetNullableDouble (object o, Double? value) { SetValue(o, value); }
|
|
278 public virtual void SetNullableDecimal (object o, Decimal? value) { SetValue(o, value); }
|
|
279 public virtual void SetNullableGuid (object o, Guid? value) { SetValue(o, value); }
|
|
280 public virtual void SetNullableDateTime(object o, DateTime? value) { SetValue(o, value); }
|
|
281 public virtual void SetNullableTimeSpan(object o, TimeSpan? value) { SetValue(o, value); }
|
|
282 public virtual void SetNullableDateTimeOffset(object o, DateTimeOffset? value) { SetValue(o, value); }
|
|
283
|
|
284 #if !SILVERLIGHT
|
|
285
|
|
286 // SQL type setters.
|
|
287 //
|
|
288 public virtual void SetSqlByte (object o, SqlByte value) { SetValue(o, value); }
|
|
289 public virtual void SetSqlInt16 (object o, SqlInt16 value) { SetValue(o, value); }
|
|
290 public virtual void SetSqlInt32 (object o, SqlInt32 value) { SetValue(o, value); }
|
|
291 public virtual void SetSqlInt64 (object o, SqlInt64 value) { SetValue(o, value); }
|
|
292 public virtual void SetSqlSingle (object o, SqlSingle value) { SetValue(o, value); }
|
|
293 public virtual void SetSqlBoolean (object o, SqlBoolean value) { SetValue(o, value); }
|
|
294 public virtual void SetSqlDouble (object o, SqlDouble value) { SetValue(o, value); }
|
|
295 public virtual void SetSqlDateTime(object o, SqlDateTime value) { SetValue(o, value); }
|
|
296 public virtual void SetSqlDecimal (object o, SqlDecimal value) { SetValue(o, value); }
|
|
297 public virtual void SetSqlMoney (object o, SqlMoney value) { SetValue(o, value); }
|
|
298 public virtual void SetSqlGuid (object o, SqlGuid value) { SetValue(o, value); }
|
|
299 public virtual void SetSqlString (object o, SqlString value) { SetValue(o, value); }
|
|
300
|
|
301 #endif
|
|
302
|
|
303 #endregion
|
|
304 }
|
|
305 }
|