public virtual void Apply([NotNull] BsonMemberMap memberMap) { Check.NotNull(memberMap, nameof(memberMap)); if (memberMap.MemberType.TryGetSequenceType() != null) { memberMap.SetShouldSerializeMethod(@object => { object value = memberMap.Getter(@object); return((value as IEnumerable)?.GetEnumerator().MoveNext() ?? false); }); } }
public void Apply(BsonMemberMap memberMap) { if (!typeof(IEnumerable).IsAssignableFrom(memberMap.MemberType) || //Allow IEnumerable typeof(string) == memberMap.MemberType || //But not String typeof(IDictionary).IsAssignableFrom(memberMap.MemberType)) //Or Dictionary (concrete classes only see below) { return; } //*NOTE Microsoft was too stupid to make the generic dictionary interfaces implement IDictonary even though every single concrete class does // They were also too stupid to make generic IDictionary implement IReadOnlyDictionary even though every single concrete class does I believe this should catch all if (memberMap.MemberType.IsGenericType && memberMap.MemberType.IsInterface) { var genericType = memberMap.MemberType.GetGenericTypeDefinition(); if (genericType == typeof(IDictionary <,>) || genericType == typeof(IReadOnlyDictionary <,>)) { return; } } if (memberMap.MemberType.IsArray) //Load Empty Array { memberMap.SetDefaultValue(() => Array.CreateInstance(memberMap.MemberType.GetElementType(), 0)); } else if (!memberMap.MemberType.IsInterface) //Create ConcreteType directly { memberMap.SetDefaultValue(() => Activator.CreateInstance(memberMap.MemberType)); } else if (memberMap.MemberType.IsGenericType) //Generic Interface type { var interfaceType = memberMap.MemberType.GetGenericTypeDefinition(); var concreteType = InterfaceToConcreteMap.ContainsKey(interfaceType) ? InterfaceToConcreteMap[interfaceType] : DefaultType; memberMap.SetDefaultValue(() => Activator.CreateInstance(concreteType.MakeGenericType(memberMap.MemberType.GetGenericArguments()))); } else //This should just be the antique non generic interfaces like ICollection, IEnumerable, etc. { memberMap.SetDefaultValue(() => Activator.CreateInstance(typeof(List <object>))); } memberMap.SetShouldSerializeMethod(instance => { var value = (IEnumerable)memberMap.Getter(instance); return(value?.GetEnumerator().MoveNext() ?? false); }); }
private static void ShouldSerializeIfNotDefault(BsonMemberMap memberMap, string defaultString) => memberMap.SetShouldSerializeMethod(@object => !string.Equals(defaultString, memberMap.Getter(@object) as string));
private static void ShouldSerializeIfNotEmpty(BsonMemberMap memberMap) => memberMap.SetShouldSerializeMethod(@object => !string.IsNullOrEmpty(memberMap.Getter(@object) as string));