Beispiel #1
0
    public static void SerializeFields <Attr>(this JObject jObject, object model, GSerializeSettings settings = null) where Attr : Attribute
    {
        if (settings == null)
        {
            settings = new GSerializeSettings();
        }

        settings.requiredAttributeType = typeof(Attr);

        SerializeFields(jObject, model, settings);
    }
Beispiel #2
0
    public static void SerializeFields(this JObject jObject, object model, GSerializeSettings settings = null)
    {
        var fields = model.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).OrderBy(field => field.MetadataToken).ToArray();

        foreach (var fieldInfo in fields)
        {
            if (settings?.requiredAttributeType != null)
            {
                if (!fieldInfo.GetCustomAttributes(settings.requiredAttributeType, true).Any())
                {
                    continue;
                }
            }

            var preSkip = false;
            settings?.preHandler?.Invoke(model, fieldInfo, ref preSkip);
            if (preSkip)
            {
                continue;
            }

            var    value  = fieldInfo.GetValue(model);
            JToken jToken = null;

            if (value == null)
            {
                jToken = string.Empty;
            }
            else if (fieldInfo.FieldType.IsValueType && !fieldInfo.FieldType.IsEnum && !fieldInfo.FieldType.IsPrimitive)
            {
                // Struct
                var useDefaultHandler = true;
                if (settings?.memberHandler != null)
                {
                    JObject jField = null;
                    useDefaultHandler = !settings.memberHandler.Invoke(model, fieldInfo, out jField);
                    jToken            = jField;
                }

                if (useDefaultHandler)
                {
                    var jField = new JObject();
                    jField.SerializeFields(value);

                    jToken = jField;
                }
            }
            else if (fieldInfo.FieldType.IsClass && fieldInfo.FieldType != typeof(string))
            {
                // Class
                var useDefaultHandler = true;
                if (settings?.memberHandler != null)
                {
                    JObject jField = null;
                    useDefaultHandler = !settings.memberHandler.Invoke(model, fieldInfo, out jField);
                    jToken            = jField;
                }

                if (useDefaultHandler)
                {
                    if (typeof(IEnumerable).IsAssignableFrom(fieldInfo.FieldType))
                    {
                        var jSettings = new JsonSerializerSettings();
                        if (settings?.requiredAttributeType != null)
                        {
                            jSettings.ContractResolver = new RequireAttributeResolver(settings.requiredAttributeType);
                        }

                        var jString = JsonConvert.SerializeObject(fieldInfo.GetValue(model), jSettings);
                        jToken = JToken.Parse(jString);
                    }
                    else
                    {
                        var jField = new JObject();
                        jField.SerializeFields(value, settings);

                        jToken = jField;
                    }
                }
            }
            else if (fieldInfo.FieldType == typeof(string) || fieldInfo.FieldType.IsEnum || fieldInfo.FieldType.IsPrimitive)
            {
                // Enumm or String or Primitive
                jToken = value.ToString();
            }

            if (jToken != null)
            {
                jObject.Add(fieldInfo.Name, jToken);
            }
        }
    }