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); }
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); } } }