コード例 #1
0
 /// <summary>
 /// Convert the value extracted from the source object into an equivalent value suitable
 /// to be assigned to the target property, based on the copying behaviour assigned
 /// </summary>
 /// <param name="value"></param>
 /// <param name="behaviour"></param>
 /// <param name="objectMap"></param>
 /// <returns></returns>
 private static object ValueToAssign(object value, ref CopyBehaviour behaviour,
                                     CopyBehaviour itemsBehaviour, ref Dictionary <object, object> objectMap)
 {
     if (behaviour == CopyBehaviour.MAP ||
         behaviour == CopyBehaviour.MAP_OR_COPY ||
         behaviour == CopyBehaviour.MAP_OR_DUPLICATE)
     {
         //Attempt to map:
         if (objectMap != null && value != null && objectMap.ContainsKey(value))
         {
             value = objectMap[value];
         }
         //Fallback behaviours on mapping fail:
         else if (behaviour == CopyBehaviour.MAP_OR_COPY)
         {
             behaviour = CopyBehaviour.COPY;
         }
         else if (behaviour == CopyBehaviour.MAP_OR_DUPLICATE)
         {
             behaviour = CopyBehaviour.DUPLICATE;
         }
         else
         {
             behaviour = CopyBehaviour.DO_NOT_COPY;
         }
     }
     //Non-mapping behaviours:
     if (behaviour == CopyBehaviour.DUPLICATE)
     {
         if (value is IDuplicatable)
         {
             IDuplicatable dupObj = value as IDuplicatable;
             value = dupObj.Duplicate(ref objectMap, itemsBehaviour);
         }
         else
         {
             behaviour = CopyBehaviour.COPY;
         }
     }
     return(value);
 }
コード例 #2
0
 /// <summary>
 /// 複製可能なオブジェクトの複製を行う
 /// Nullチェック付き
 /// </summary>
 /// <typeparam name="Duplicated">複製されるオブジェクト型</typeparam>
 /// <param name="origin">複製される雛形オブジェクト</param>
 /// <returns>複製されたオブジェクト</returns>
 public static Duplicated Duplicate <Duplicated>(this IDuplicatable <Duplicated> origin)
     where Duplicated : IDuplicatable <Duplicated>
 => origin != null?origin.MemberwiseClonePublic() : default(Duplicated);