示例#1
0
        public static void AddFields(this JObject jObject, object model, FieldHandlerDelegate preHandler = null, FieldToJTokenDelegate structHandler = null, FieldToJTokenDelegate classHandler = null)
        {
            FieldInfo[] fields = model.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

            foreach (FieldInfo fieldInfo in fields)
            {
                bool preSkip = false;
                preHandler?.Invoke(model, fieldInfo, ref preSkip);
                if (preSkip)
                {
                    continue;
                }

                object 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
                    if (structHandler != null)
                    {
                        JObject jField = null;
                        structHandler.Invoke(model, fieldInfo, out jField);
                        jToken = jField;
                    }
                    else
                    {
                        JObject jValue = new JObject();
                        AddFields(jValue, value);

                        jToken = jValue;
                    }
                }
                else if (fieldInfo.FieldType.IsClass && fieldInfo.FieldType != typeof(string))
                {
                    // Class
                    if (classHandler != null)
                    {
                        JObject jField = null;
                        classHandler.Invoke(model, fieldInfo, out jField);
                        jToken = jField;
                    }
                }
                else
                {
                    jToken = value.ToString();
                }

                if (jToken != null)
                {
                    jObject.Add(fieldInfo.Name, jToken);
                }
            }
        }
示例#2
0
        public static void AddAttrFields <Attr>(this JObject jObject, object model, FieldToJTokenDelegate structHandler = null, FieldToJTokenDelegate classHandler = null)
            where Attr : Attribute
        {
            FieldHandlerDelegate preHandler = (object handleModel, FieldInfo fieldInfo, ref bool skip) => {
                Attr editorAttribute = fieldInfo.GetCustomAttribute(typeof(Attr)) as Attr;

                if (editorAttribute == null)
                {
                    skip = true;
                }
            };

            AddFields(jObject, model, preHandler, structHandler, classHandler);
        }
示例#3
0
        public static void LoadAttrFields <Attr>(this object model, JObject jObject, FieldHandlerDelegate preHandler = null)
            where Attr : Attribute
        {
            FieldHandlerDelegate attrPreHandler = (object handleModel, FieldInfo fieldInfo, ref bool skip) => {
                Attr editorAttribute = fieldInfo.GetCustomAttribute(typeof(Attr)) as Attr;

                if (editorAttribute == null)
                {
                    skip = true;
                }

                preHandler?.Invoke(handleModel, fieldInfo, ref skip);
            };

            LoadFields(model, jObject, attrPreHandler);
        }
示例#4
0
        public static void LoadFields(this object model, JObject jObject, FieldHandlerDelegate preHandler = null)
        {
            FieldInfo[] fields = model.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

            foreach (FieldInfo fieldInfo in fields)
            {
                bool preSkip = false;
                preHandler?.Invoke(model, fieldInfo, ref preSkip);
                if (preSkip)
                {
                    continue;
                }

                if (!jObject.ContainsKey(fieldInfo.Name))
                {
                    continue;
                }

                if (fieldInfo.FieldType.IsValueType && !fieldInfo.FieldType.IsEnum && !fieldInfo.FieldType.IsPrimitive)
                {
                    // Struct
                    JObject jField = jObject.GetValue(fieldInfo.Name).ToObject <JObject>();

                    if (jField == null)
                    {
                        continue;
                    }

                    object field = Activator.CreateInstance(fieldInfo.FieldType);
                    LoadFields(field, jField);

                    fieldInfo.SetValue(model, field);
                }
                else if (fieldInfo.FieldType.IsClass && fieldInfo.FieldType != typeof(string))
                {
                    // Class
                    JObject jField = jObject.GetValue(fieldInfo.Name).ToObject <JObject>();

                    if (jField == null)
                    {
                        continue;
                    }

                    object field = Activator.CreateInstance(fieldInfo.FieldType);
                    LoadFields(field, jField);

                    fieldInfo.SetValue(model, field);
                }
                else
                {
                    string stringValue = jObject.GetValue <string>(fieldInfo.Name);

                    if (fieldInfo.FieldType.IsEnum)
                    {
                        fieldInfo.SetValue(model, Enum.Parse(fieldInfo.FieldType, stringValue));
                    }
                    else
                    {
                        fieldInfo.SetValue(model, Convert.ChangeType(stringValue, fieldInfo.FieldType));
                    }
                }
            }
        }