- Timestamp:
- 01/18/11 15:50:23 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Persistence/3.3/Core/DataMemberAccessor.cs
r4068 r5324 150 150 return GenerateFieldGetter(fieldInfo); 151 151 } else if (memberInfo.MemberType == MemberTypes.Property) { 152 PropertyInfo propertyInfo = (PropertyInfo)memberInfo; 153 if (!propertyInfo.CanRead || !propertyInfo.CanWrite) { 154 throw new PersistenceException( 155 "Storable properties must implement both a Get and a Set Accessor. "); 156 } 157 return GeneratePropertyGetter(propertyInfo); 152 return GeneratePropertyGetter((PropertyInfo)memberInfo); 158 153 } else { 159 154 throw new PersistenceException( … … 172 167 return GenerateFieldSetter(fieldInfo); 173 168 } else if (memberInfo.MemberType == MemberTypes.Property) { 174 PropertyInfo propertyInfo = (PropertyInfo)memberInfo; 175 if (!propertyInfo.CanRead || !propertyInfo.CanWrite) { 176 throw new PersistenceException( 177 "Storable properties must implement both a Get and a Set Accessor. "); 178 } 179 return GeneratePropertySetter(propertyInfo); 169 return GeneratePropertySetter((PropertyInfo)memberInfo); 180 170 } else { 181 171 throw new PersistenceException( … … 201 191 202 192 /// <summary> 203 /// Generates a dynamically compiled sett to access fields (even private ones).193 /// Generates a dynamically compiled setter to access fields (even private ones). 204 194 /// </summary> 205 195 /// <param name="fieldInfo">The field info.</param> … … 223 213 /// <returns>A Func<object, object></returns> 224 214 public static Func<object, object> GeneratePropertyGetter(PropertyInfo propertyInfo) { 215 MethodInfo getter = propertyInfo.GetGetMethod(true); 216 if (getter == null) 217 return null; 225 218 DynamicMethod dm = new DynamicMethod("", typeof(object), new Type[] { typeof(object) }, propertyInfo.DeclaringType, true); 226 219 ILGenerator ilgen = dm.GetILGenerator(); 227 220 ilgen.Emit(OpCodes.Ldarg_0); 228 221 ilgen.Emit(OpCodes.Castclass, propertyInfo.DeclaringType); 229 ilgen.Emit(OpCodes.Callvirt, propertyInfo.GetGetMethod(true));222 ilgen.Emit(OpCodes.Callvirt, getter); 230 223 ilgen.Emit(OpCodes.Box, propertyInfo.PropertyType); 231 224 ilgen.Emit(OpCodes.Ret); … … 239 232 /// <returns>An Action<object, object%gt;</returns> 240 233 public static Action<object, object> GeneratePropertySetter(PropertyInfo propertyInfo) { 234 MethodInfo setter = propertyInfo.GetSetMethod(true); 235 if (setter == null) 236 return null; 241 237 DynamicMethod dm = new DynamicMethod("", null, new Type[] { typeof(object), typeof(object) }, propertyInfo.DeclaringType, true); 242 238 ILGenerator ilgen = dm.GetILGenerator(); … … 245 241 ilgen.Emit(OpCodes.Ldarg_1); 246 242 ilgen.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType); 247 ilgen.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod(true));243 ilgen.Emit(OpCodes.Callvirt, setter); 248 244 ilgen.Emit(OpCodes.Ret); 249 245 return (Action<object, object>)dm.CreateDelegate(typeof(Action<object, object>));
Note: See TracChangeset
for help on using the changeset viewer.