Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/18/11 15:50:23 (13 years ago)
Author:
epitzer
Message:

Implement one-way serialization that allows either only loading or only saving of storable members by setting a new property called AllowOneWay on the [Storable] attribute (#1385)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Persistence/3.3/Core/DataMemberAccessor.cs

    r4068 r5324  
    150150        return GenerateFieldGetter(fieldInfo);
    151151      } 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);
    158153      } else {
    159154        throw new PersistenceException(
     
    172167        return GenerateFieldSetter(fieldInfo);
    173168      } 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);
    180170      } else {
    181171        throw new PersistenceException(
     
    201191
    202192    /// <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).
    204194    /// </summary>
    205195    /// <param name="fieldInfo">The field info.</param>
     
    223213    /// <returns>A Func&lt;object, object&gt;</returns>
    224214    public static Func<object, object> GeneratePropertyGetter(PropertyInfo propertyInfo) {
     215      MethodInfo getter = propertyInfo.GetGetMethod(true);
     216      if (getter == null)
     217        return null;
    225218      DynamicMethod dm = new DynamicMethod("", typeof(object), new Type[] { typeof(object) }, propertyInfo.DeclaringType, true);
    226219      ILGenerator ilgen = dm.GetILGenerator();
    227220      ilgen.Emit(OpCodes.Ldarg_0);
    228221      ilgen.Emit(OpCodes.Castclass, propertyInfo.DeclaringType);
    229       ilgen.Emit(OpCodes.Callvirt, propertyInfo.GetGetMethod(true));
     222      ilgen.Emit(OpCodes.Callvirt, getter);
    230223      ilgen.Emit(OpCodes.Box, propertyInfo.PropertyType);
    231224      ilgen.Emit(OpCodes.Ret);
     
    239232    /// <returns>An Action&lt;object, object%gt;</returns>
    240233    public static Action<object, object> GeneratePropertySetter(PropertyInfo propertyInfo) {
     234      MethodInfo setter = propertyInfo.GetSetMethod(true);
     235      if (setter == null)
     236        return null;
    241237      DynamicMethod dm = new DynamicMethod("", null, new Type[] { typeof(object), typeof(object) }, propertyInfo.DeclaringType, true);
    242238      ILGenerator ilgen = dm.GetILGenerator();
     
    245241      ilgen.Emit(OpCodes.Ldarg_1);
    246242      ilgen.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType);
    247       ilgen.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod(true));
     243      ilgen.Emit(OpCodes.Callvirt, setter);
    248244      ilgen.Emit(OpCodes.Ret);
    249245      return (Action<object, object>)dm.CreateDelegate(typeof(Action<object, object>));
Note: See TracChangeset for help on using the changeset viewer.