private bool IsValueDefault(object v, IsSerializedForLocalRepositoryAttribute IsSerializedForLocalRepository) { object o = IsSerializedForLocalRepository.GetDefualtValue(); if (o == null) { return(false); // DeaultValue annotation not exist on attr } if (v.Equals(o)) { return(true); } else { return(false); } //object def = GetDefault(v.GetType()); //if (def != null) //{ // // if (((object)v) == def) return true; // NOT WORKING // string s1 = ((object)v).ToString(); // if (string.IsNullOrEmpty(s1)) return true; // string s2 = def.ToString(); // if (s1 == s2) return true; //} //return false; }
private void WriteRepoItemProperties(XmlTextWriter xml, RepositoryItemBase ri) { // Get the properties - need to be ordered so compare/isDirty can work faster var properties = ri.GetType().GetMembers().Where(x => x.MemberType == MemberTypes.Property).OrderBy(x => x.Name); // .OrderBy(x => x.Name); foreach (MemberInfo mi in properties) { object v = null; IsSerializedForLocalRepositoryAttribute token = Attribute.GetCustomAttribute(mi, typeof(IsSerializedForLocalRepositoryAttribute), false) as IsSerializedForLocalRepositoryAttribute; if (token == null) { continue; } //Get tha attr value v = ri.GetType().GetProperty(mi.Name).GetValue(ri); // We write the property value only if it is not null and different than default when serialzied if (v == null) { continue; } if (IsValueDefault(v, token)) { continue; } // Enum might be unknow = not set - so no need to write to xml, like null for object if (ri.GetType().GetProperty(mi.Name).PropertyType.IsEnum) { string vs = v.ToString(); // No need to write enum unknown = null if (vs != "Unknown") { xmlwriteatrr(xml, mi.Name, vs); } } else { if (v != null) { //if (v is RepositoryItem) //{ // xml.WriteStartAttribute(mi.Name); // // xml.WriteString("Value"); // xmlwriteObject(xml, v); // xml.WriteWhitespace("\n"); // xml.WriteEndAttribute(); //} // else //{ xmlwriteatrr(xml, mi.Name, v.ToString()); // } } } } }
private static void SetObjectSerialziedAttrDefaultValue(object obj) { // TODO: check if we can combine the below into one faster func try { var properties = obj.GetType().GetMembers().Where(x => x.MemberType == MemberTypes.Property); foreach (MemberInfo mi in properties) { IsSerializedForLocalRepositoryAttribute token = Attribute.GetCustomAttribute(mi, typeof(IsSerializedForLocalRepositoryAttribute), false) as IsSerializedForLocalRepositoryAttribute; if (token != null) { if (token.GetDefualtValue() != null) { obj.GetType().GetProperty(mi.Name).SetValue(obj, token.GetDefualtValue()); } } } var fields = obj.GetType().GetMembers().Where(x => x.MemberType == MemberTypes.Field); foreach (MemberInfo mi in fields) { IsSerializedForLocalRepositoryAttribute token = Attribute.GetCustomAttribute(mi, typeof(IsSerializedForLocalRepositoryAttribute), false) as IsSerializedForLocalRepositoryAttribute; if (token != null) { if (token.GetDefualtValue() != null) { obj.GetType().GetField(mi.Name).SetValue(obj, token.GetDefualtValue()); } } } } catch (Exception ex) { throw new Exception("Unable to set default value of serialized Repository Item - " + ex.Message); } }
private void WriteRepoItemFields(XmlTextWriter xml, RepositoryItemBase ri) { var Fields = ri.GetType().GetMembers().Where(x => x.MemberType == MemberTypes.Field).OrderBy(x => x.Name); foreach (MemberInfo fi in Fields) { object v = null; IsSerializedForLocalRepositoryAttribute token = Attribute.GetCustomAttribute(fi, typeof(IsSerializedForLocalRepositoryAttribute), false) as IsSerializedForLocalRepositoryAttribute; if (token == null) { continue; } if (LazyLoadAttr.Contains(fi.Name)) { bool b = ((IObservableList)(ri.GetType().GetField(fi.Name).GetValue(ri))).LazyLoad; if (b) { // Hurray! string s = ((IObservableList)(ri.GetType().GetField(fi.Name).GetValue(ri))).StringData; xml.WriteStartElement("Activities"); //!!! xml.WriteString(s); xml.WriteEndElement(); } } v = ri.GetType().GetField(fi.Name).GetValue(ri); // We write the property value only if it is not null and different than default when serialized if (v == null) { continue; } if (IsValueDefault(v, token)) { continue; } if (v != null) { if (v is IObservableList) { IObservableList vv = (IObservableList)v; if (vv.Count != 0) // Write only if we have items - save xml space { xmlwriteObservableList(xml, fi.Name, (IObservableList)v); } } else { if (v is List <string> ) { xmlwriteStringList(xml, fi.Name, (List <string>)v); } else if (v is RepositoryItemBase) { xmlwriteSingleObjectField(xml, fi.Name, v); } else { //xml.WriteComment(">>>>>>>>>>>>>>>>> Unknown Field type to serialize - " + fi.Name + " - " + v.ToString()); throw new Exception("Unknown Field type to serialize - " + fi.Name + " - " + v.ToString()); } } } } }