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);
            });
        }
Ejemplo n.º 3
0
 private static void ShouldSerializeIfNotDefault(BsonMemberMap memberMap, string defaultString)
 => memberMap.SetShouldSerializeMethod(@object => !string.Equals(defaultString, memberMap.Getter(@object) as string));
Ejemplo n.º 4
0
 private static void ShouldSerializeIfNotEmpty(BsonMemberMap memberMap)
 => memberMap.SetShouldSerializeMethod(@object => !string.IsNullOrEmpty(memberMap.Getter(@object) as string));