internal override object Copy(object t, object instance, BCopierContext copierContext, BCopierSettings copierSettings) { Array casted = (Array)t; Array castedInstance = (Array)instance; // cached locals object curr = null; Type currType = null; IBCopierInternal c = null; object copy = null; for (int i = 0; i < casted.Length; i++) { curr = casted.GetValue(i); currType = curr.GetType(); c = GetElementCopier(currType); copy = c.Copy(curr, copierContext, copierSettings); castedInstance.SetValue(copy, i); } return(castedInstance); }
internal override object Copy(object t, object instance, BCopierContext copierContext, BCopierSettings copierSettings) { // TODO : optimize by looking for contructor with capacity first // DONE IList casted = (IList)t; IList castedInstance = (IList)instance; // cached locals object curr = null; Type currType = null; IBCopierInternal c = null; object copy = null; for (int i = 0; i < casted.Count; i++) { curr = casted[i]; currType = curr.GetType(); c = GetElementCopier(currType); copy = c.Copy(curr, copierContext, copierSettings); castedInstance.Add(copy); } return(castedInstance); }
internal static void Register(IBCopierInternal copier) { if (!Copiers.ContainsKey(copier.Type)) { UncheckedRegister(copier); } }
protected override void Initialize() { base.Initialize(); ListType = Type.GetGenericTypeDefinition(); ElementType = Type.GenericTypeArguments[0]; ElementCopier = BDeepCopyProvider.GetOrCreate(ElementType); Constructor = GetConstructor(Type); // TODO : make separete copier for non-inheritable classes //ElementsAreConcrete = ElementType.IsAbstract || ElementType.IsInterface; }
internal override object Copy(object t, object instance, BCopierContext copierContext, BCopierSettings copierSettings) { // TODO : optimize by looking for contructor with capacity first // DONE IDictionary casted = (IDictionary)t; IDictionary castedInstance = (IDictionary)instance; object[] keys = new object[casted.Count]; object[] vals = new object[casted.Count]; casted.Keys.CopyTo(keys, 0); casted.Values.CopyTo(vals, 0); // cached locals object curr = null; IBCopierInternal c = null; Type currType = null; object copyKey = null; object copyVal = null; for (int i = 0; i < casted.Count; i++) { // copy key curr = keys[i]; currType = curr.GetType(); c = GetKeyCopier(currType); copyKey = c.Copy(curr, copierContext, copierSettings); // copy key curr = vals[i]; currType = curr.GetType(); c = GetValueCopier(currType); copyVal = c.Copy(curr, copierContext, copierSettings); castedInstance.Add(copyKey, copyVal); } return(castedInstance); }
internal override object Copy(object t, object emptyCopy, BCopierContext copierContext, BCopierSettings copierSettings) { for (int i = 0; i < MemberCount; i++) { MemberInfo mem = MemberInfos[i]; Func <object, object> getter = Getters[i]; Action <object, object> setter = Setters[i]; IBCopierInternal copier = Copiers[i]; Dictionary <Type, CopierSettingAttribute> customOverrides = BCopierOverrides[i]; List <Tuple <CopierSettingAttribute, IBCopierOverrideInternal> > internalOverrides = InternalBCopierOverrides[i]; object originalVal = getter.Invoke(t); object copy = null; // if we found an internal override // then we apply it and go next if (TryInternalOverride(internalOverrides, mem, ref originalVal, copier, out copy)) { setter.Invoke(emptyCopy, copy); continue; } // if no copier setting we use default if (copierSettings == null) { copy = copier.Copy(originalVal, copierContext, copierSettings); } // try to check if we can apply an override // if not , then we use the default copy else if (!TryCustomOverride(copierSettings, mem, ref originalVal, copier, customOverrides, out copy)) { copy = copier.Copy(originalVal, copierContext, copierSettings); } // copy from original and assign to new instance setter.Invoke(emptyCopy, copy); } return(emptyCopy); }
private bool TryCustomOverride(BCopierSettings copierSettings, MemberInfo memberInfo, ref object originalVal, IBCopierInternal copier, Dictionary <Type, CopierSettingAttribute> overrides, out object copy) { // look for overrides foreach (KeyValuePair <Type, CopierSettingAttribute> kv in overrides) { // custom copier overrides for (int c = 0; c < copierSettings.CopierOverrides.Count; c++) { IBCopierOverride curr = copierSettings.CopierOverrides[c]; if (curr.AttributeType == kv.Key) { copy = curr.CopyOverride(in originalVal, memberInfo, kv.Value); return(true); } } } copy = null; return(false); }
private bool TryInternalOverride(List <Tuple <CopierSettingAttribute, IBCopierOverrideInternal> > internalOverrides, MemberInfo memberInfo, ref object originalVal, IBCopierInternal copier, out object copy) { // look for overrides for (int i = 0; i < internalOverrides.Count; i++) { Tuple <CopierSettingAttribute, IBCopierOverrideInternal> t = internalOverrides[i]; copy = t.Item2.CopyOverride(originalVal, memberInfo, t.Item1, copier); return(true); } copy = null; return(false); }
private static void UncheckedRegister(IBCopierInternal copier) { Copiers.Add(copier.Type, copier); }