Esempio n. 1
0
 private static void EmiFieldOrPropertyCopyIL(ILGenerator generator, MethodInfo deepCopyMethod, FieldOrPropertyInfo member)
 {
     Debug.Assert(member.MemberInfo is FieldInfo || member.MemberInfo is PropertyInfo, "Field or property expected");
     if (member.ValueType.IsValueType || member.IsDefined(typeof(ShallowCopyAttribute), false))
     {
         // shallow copy - copy value by simple assignment
         generator.Emit(OpCodes.Ldarg_1);
         generator.Emit(OpCodes.Ldarg_0);
         if (member.MemberInfo is FieldInfo)
         {
             var field = (FieldInfo)member.MemberInfo;
             generator.Emit(OpCodes.Ldfld, field);
             generator.Emit(OpCodes.Stfld, field);
         }
         else
         {
             var property = (PropertyInfo)member.MemberInfo;
             generator.Emit(OpCodes.Call, property.GetGetMethod());
             generator.Emit(OpCodes.Call, property.GetSetMethod());
         }
     }
     else
     {
         // deep copy - call special method for obtaining a deep copy
         generator.Emit(OpCodes.Ldarg_1);
         generator.Emit(OpCodes.Ldarg_0);
         if (member.MemberInfo is FieldInfo)
             generator.Emit(OpCodes.Ldfld, (FieldInfo)member.MemberInfo);
         else
             generator.Emit(OpCodes.Call, ((PropertyInfo)member.MemberInfo).GetGetMethod());
         generator.Emit(OpCodes.Call, deepCopyMethod);
         if (member.MemberInfo is FieldInfo)
             generator.Emit(OpCodes.Stfld, (FieldInfo)member.MemberInfo);
         else
             generator.Emit(OpCodes.Call, ((PropertyInfo)member.MemberInfo).GetSetMethod());
     }
 }