private static IEnumerable <CloneFieldInfo> GetTypeFields(Type type) { return(type .Fields() .Where(x => !x.IsStatic && x.DeclaringType == type && x.CanWrite()) .Select(x => { var attrMember = (MemberInfo)x.DeclaringProperty() ?? x; var clone = CloneObjectEx.GetCloneTypeFromAttribute(attrMember) ?? CloneObjectEx.GetCloneType(x.FieldType); return new CloneFieldInfo(x, clone); })); }
private static CloneObject CreateArrayClone(Type type) { var elementType = type.GetElementType(); switch (CloneObjectEx.GetCloneType(elementType)) { case CloneType.Ignore: return(CloneObjectEx.Ignore); case CloneType.Copy: return(CloneObjectEx.CopyArray); case CloneType.Deep: return(CloneObjectEx.CloneArray(elementType)); default: throw new ArgumentOutOfRangeException(); } }
private static CloneObject CreateObjectClone(Type type) { switch (CloneObjectEx.GetCloneType(type)) { case CloneType.Ignore: return(CloneObjectEx.Ignore); case CloneType.Copy: return(CloneObjectEx.Copy); case CloneType.Deep: if (type.IsArray) { return(CreateArrayClone(type)); } return(CloneObjectEx.DeepCloneObject(type)); default: throw new ArgumentOutOfRangeException(); } }