Esempio n. 1
0
            private static ValueEncoder CreateTypeEncoder(Type type)
            {
                // can be parsed from string?
                var parseMethod = type.GetMethods(BindingFlags.Static | BindingFlags.Public)
                                  .FirstOrDefault(m => m.Name == "Parse" && m.GetParameters().Length == 1 && m.GetParameters()[0].ParameterType == typeof(string));

                if (parseMethod != null)
                {
                    return((ValueEncoder)Activator.CreateInstance(typeof(StringEncoder <>).MakeGenericType(type), NoArgs));
                }

                Type keyType;
                Type valueType;

                if (TypeHelper.TryGetDictionaryTypes(type, out keyType, out valueType))
                {
                    return((ValueEncoder)Activator.CreateInstance(typeof(DictionaryEncoder <, ,>).MakeGenericType(type, keyType, valueType)));
                }

                if (typeof(IEnumerable).IsAssignableFrom(type))
                {
                    var elementType = TypeHelper.GetElementType(type);
                    return((ValueEncoder)Activator.CreateInstance(typeof(EnumerableEncoder <,>).MakeGenericType(type, elementType)));
                }

                var members = EncodingMember.GetEncodingMembers(type);

                if (members.Count > 0)
                {
                    return((ValueEncoder)Activator.CreateInstance(typeof(ObjectMemberEncoder <>).MakeGenericType(type), new object[] { members }));
                }

                throw new InvalidOperationException(string.Format("The type '{0}' cannot be encoded into JSON.", type));
            }
Esempio n. 2
0
 public MemberEncoder(EncodingMember <TInstance, TMember> member)
 {
     this.member       = member;
     this.valueEncoder = GetEncoder <TMember>();
 }