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)); }
public MemberEncoder(EncodingMember <TInstance, TMember> member) { this.member = member; this.valueEncoder = GetEncoder <TMember>(); }