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