public static void TryChangeObjectType(IList list, int index, Type type, TaggedTypesCfg cfg, ListMetaData ld = null)
        {
            object previous = null;

            if (list != null && index >= 0 && index < list.Count)
            {
                previous = list[index];
            }

            var el = previous;

            var iTag = el as IGotClassTag;

            var std = (el as ICfgCustom);

            var ed = ld.TryGetElement(index);

            if (ed != null && ld.keepTypeData && iTag != null)
            {
                ed.ChangeType(ref el, type, cfg, ld.keepTypeData);
            }
            else
            {
                el = std.TryDecodeInto <object>(type);
                CfgExtensions.TryCopy_Std_AndOtherData(previous, el);
            }

            list[index] = el;
        }
示例#2
0
        public void ChangeType(ref object obj, Type newType, TaggedTypesCfg taggedTypes, bool keepTypeConfig = false)
        {
            var previous = obj;

            var tObj = obj as IGotClassTag;

            if (keepTypeConfig && tObj != null)
            {
                _perTypeConfig[tObj.ClassTag] = tObj.Encode().CfgData;
            }

            obj = Activator.CreateInstance(newType);

            var std = obj as ICfg;

            if (std != null)
            {
                CfgData data;
                if (_perTypeConfig.TryGetValue(taggedTypes.Tag(newType), out data))
                {
                    std.DecodeFull(data);
                }
            }

            CfgExtensions.TryCopy_Std_AndOtherData(previous, obj);
        }