public void WriteAsAttribute(Type type, String classIdAttribute, String classNameAttribute, String classNamespaceAttribute, String classMemberAttribute, IWriter writer) { Type realType = ProxyHelper.GetRealType(type); int typeId = writer.GetIdOfObject(type); if (typeId > 0) { writer.WriteAttribute(classIdAttribute, typeId.ToString()); return; } typeId = writer.AcquireIdForObject(realType); writer.WriteAttribute(classIdAttribute, typeId.ToString()); StringBuilder sb = StringBuilder; try { while (type.IsArray) { sb.Append("[]"); type = type.GetElementType(); } String xmlName, xmlNamespace; IXmlTypeKey xmlType; Type genericArgumentType = null; if (type.IsGenericType && !typeof(Nullable <>).Equals(type.GetGenericTypeDefinition())) { xmlType = XmlTypeRegistry.GetXmlType(type.GetGenericTypeDefinition()); genericArgumentType = type.GetGenericArguments()[0]; } else { xmlType = XmlTypeRegistry.GetXmlType(type); } xmlName = xmlType.Name; xmlNamespace = xmlType.Namespace; if (sb.Length > 0) { sb.Insert(0, xmlName); writer.WriteAttribute(classNameAttribute, sb.ToString()); sb.Length = 0; } else { writer.WriteAttribute(classNameAttribute, xmlName); } writer.WriteAttribute(classNamespaceAttribute, xmlNamespace); if (genericArgumentType != null) { WriteAsAttribute(genericArgumentType, "gti", "gn", "gns", "gm", writer); } if (!realType.IsArray && !realType.IsEnum && !realType.IsInterface && !typeof(Type).Equals(realType)) { ITypeInfo typeInfo = TypeInfoProvider.GetTypeInfo(type); ITypeInfoItem[] members = typeInfo.Members; List <ITypeInfoItem> membersToWrite = new List <ITypeInfoItem>(members.Length); for (int a = 0, size = members.Length; a < size; a++) { ITypeInfoItem member = members[a]; if (member.IsXMLIgnore) { continue; } if (sb.Length > 0) { sb.Append(' '); } sb.Append(member.Name); membersToWrite.Add(member); } if (sb.Length > 0) { writer.WriteAttribute(classMemberAttribute, sb.ToString()); sb.Length = 0; } writer.PutMembersOfType(type, ListUtil.ToArray(membersToWrite)); } } finally { sb.Length = 0; } }
protected bool ArePrimitivesEqual(IEntityMetaData metaData, PrimitiveMember primitiveMember, Object objValue, Object cloneValue, MergeHandle handle) { if (objValue != null && cloneValue != null) { if (objValue is Array && cloneValue is Array) { Array objArray = (Array)objValue; Array cloneArray = (Array)cloneValue; if (objArray.Length != cloneArray.Length) { return(false); } for (int b = objArray.Length; b-- > 0;) { Object objItem = objArray.GetValue(b); Object cloneItem = cloneArray.GetValue(b); if (!EqualsObjects(objItem, cloneItem)) { return(false); } } return(true); } else if (objValue is IList && cloneValue is IList) { IList objList = (IList)objValue; IList cloneList = (IList)cloneValue; if (objList.Count != cloneList.Count) { return(false); } for (int b = objList.Count; b-- > 0;) { Object objItem = objList[b]; Object cloneItem = cloneList[b]; if (!EqualsObjects(objItem, cloneItem)) { return(false); } } return(true); } else if (TypeInfoProvider.GetTypeInfo(objValue.GetType()).DoesImplement(typeof(ISet <>)) && TypeInfoProvider.GetTypeInfo(cloneValue.GetType()).DoesImplement(typeof(ISet <>))) { if (((ICollection)objValue).Count != ((ICollection)cloneValue).Count) { return(false); } MethodInfo setEqualsMethod = cloneValue.GetType().GetMethod("SetEquals"); return((bool)setEqualsMethod.Invoke(cloneValue, new Object[] { objValue })); } else if (objValue is ICollection && cloneValue is ICollection) { IEnumerator objIter = ((IEnumerable)objValue).GetEnumerator(); IEnumerator cloneIter = ((IEnumerable)cloneValue).GetEnumerator(); while (objIter.MoveNext()) { if (!cloneIter.MoveNext()) { return(false); } Object objItem = objIter.Current; Object cloneItem = cloneIter.Current; if (!EqualsObjects(objItem, cloneItem)) { return(false); } } if (cloneIter.MoveNext()) { return(false); } return(true); } else if (objValue is IEnumerable && cloneValue is IEnumerable) { IEnumerator objIter = ((IEnumerable)objValue).GetEnumerator(); IEnumerator cloneIter = ((IEnumerable)cloneValue).GetEnumerator(); while (objIter.MoveNext()) { if (!cloneIter.MoveNext()) { return(false); } Object objItem = objIter.Current; Object cloneItem = cloneIter.Current; if (!EqualsObjects(objItem, cloneItem)) { return(false); } } if (cloneIter.MoveNext()) { return(false); } return(true); } } return(EqualsObjects(objValue, cloneValue)); }
public Type ReadFromAttribute(String classIdAttribute, String classNameAttribute, String classNamespaceAttribute, String classMemberAttribute, IReader reader) { String classIdValue = reader.GetAttributeValue(classIdAttribute); int classId = 0; if (classIdValue != null && classIdValue.Length > 0) { classId = Int32.Parse(classIdValue); } Type typeObj = (Type)reader.GetObjectById(classId, false); if (typeObj != null) { return(typeObj); } String name = reader.GetAttributeValue(classNameAttribute); String namespaceString = reader.GetAttributeValue(classNamespaceAttribute); int dimensionCount = 0; while (name.EndsWith("[]")) { dimensionCount++; name = name.Substring(0, name.Length - 2); } typeObj = XmlTypeRegistry.GetType(name, namespaceString); String classMemberValue = reader.GetAttributeValue(classMemberAttribute); if (classMemberValue != null) { ITypeInfo typeInfo = TypeInfoProvider.GetTypeInfo(typeObj); String[] memberNames = classMemberValue.Split(' '); ITypeInfoItem[] members = new ITypeInfoItem[memberNames.Length]; for (int a = memberNames.Length; a-- > 0;) { String memberName = memberNames[a]; ITypeInfoItem member = typeInfo.GetMemberByXmlName(memberName); if (member == null) { throw new Exception("No member found with xml name '" + memberName + "' on entity '" + typeObj.FullName + "'"); } members[a] = member; } reader.PutMembersOfType(typeObj, members); } String gtIdValue = classIdAttribute.Equals("gti") ? null : reader.GetAttributeValue("gti"); Type genericArgumentType = null; if (gtIdValue != null && gtIdValue.Length > 0) { genericArgumentType = ReadFromAttribute("gti", "gn", "gns", "gm", reader); typeObj = typeObj.MakeGenericType(genericArgumentType); } while (dimensionCount-- > 0) { typeObj = typeObj.MakeArrayType(); } reader.PutObjectWithId(typeObj, classId); return(typeObj); }