/// <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); }
/// <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);