Example #1
0
 private void SetFieldOrPropValue(FieldOrProp fieldOrProp, object info, object value)
 {
     if (fieldOrProp == FieldOrProp.Field)
     {
         ((FieldInfo)info).SetValue(this, value);
     }
     else if (fieldOrProp == FieldOrProp.Property)
     {
         ((PropertyInfo)info).SetValue(this, value);
     }
     return;
 }
Example #2
0
        public void SetFieldOrPropValue(string fieldOrPropName, object value)
        {
            FieldOrProp fieldOrProp     = FieldOrProp.Unknown;
            object      info            = null;
            Type        fieldOrPropType = null;

            var fieldInfo = typeof(Settings).GetField(fieldOrPropName);

            if (fieldInfo != null)
            {
                fieldOrPropType = fieldInfo.FieldType;
                fieldOrProp     = FieldOrProp.Field;
                info            = fieldInfo;
            }
            var propInfo = typeof(Settings).GetProperty(fieldOrPropName);

            if (propInfo != null)
            {
                fieldOrPropType = propInfo.PropertyType;
                fieldOrProp     = FieldOrProp.Property;
                info            = propInfo;
            }
            if (fieldOrPropType == null)
            {
                return;
            }

            if (typeof(IEnumerable).IsAssignableFrom(fieldOrPropType))
            {
                //Assume all enumerable values are of string type for now
                var pieces  = ((string)value).Split(new string[] { "\r\n", " ", ";", "\t" }, StringSplitOptions.RemoveEmptyEntries);
                var subType = fieldOrPropType.GetGenericArguments()[0];

                var newList = Activator.CreateInstance(fieldOrPropType);
                foreach (string p in pieces)
                {
                    newList.GetType().GetMethod("Add").Invoke(newList, new object[] { Convert.ChangeType(p, newList.GetType().GetGenericArguments().Single()) });
                }

                SetFieldOrPropValue(fieldOrProp, info, newList);
            }
            else
            {
                SetFieldOrPropValue(fieldOrProp, info, Convert.ChangeType(value, fieldOrPropType));
            }
        }
Example #3
0
        internal static List <SerializedMember> GetSerializableMembers(Type type, TargetMember defaultTargetMembers, Func <SerializedMember, SerializationOverride> fieldFilter = null)
        {
            List <SerializedMember> members = new List <SerializedMember>();

            var flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;

            var classConfig = type.GetCustomAttribute <MemberConfig>();

            foreach (var m in type.GetFields(flags).Cast <MemberInfo>().Concat(type.GetProperties(flags)))
            {
                bool isPublic;
                bool isField = false, isProp = false;

                if (m is FieldInfo f)
                {
                    // Skip readonly
                    if (f.IsInitOnly)
                    {
                        continue;
                    }

                    // Skip property backing fields
                    if (f.GetCustomAttribute <CompilerGeneratedAttribute>() != null)
                    {
                        continue;
                    }

                    isPublic = f.IsPublic;
                    isField  = true;
                }
                else if (m is PropertyInfo p)
                {
                    if (!p.CanRead || !p.CanWrite)
                    {
                        continue;
                    }
                    if (p.GetIndexParameters().Length != 0)
                    {
                        continue;
                    }

                    isPublic = p.GetMethod.IsPublic;
                    isProp   = true;
                }
                else
                {
                    continue;
                }

                var serializedMember = FieldOrProp.Create(m);


                //
                // 1.) Use filter if there is one
                if (fieldFilter != null)
                {
                    var filterResult = fieldFilter(serializedMember);

                    if (filterResult == SerializationOverride.ForceInclude)
                    {
                        members.Add(serializedMember);
                        continue;
                    }
                    else if (filterResult == SerializationOverride.ForceSkip)
                    {
                        continue;
                    }
                }

                //
                // 2.) Use attribute
                var ignore  = m.GetCustomAttribute <Ignore>(true) != null;
                var include = m.GetCustomAttribute <Include>(true) != null;

                if (ignore && include)
                {
                    throw new Exception($"Member '{m.Name}' on type '{type.Name}' has both [Ignore] and [Include]!");
                }

                if (ignore)
                {
                    continue;
                }

                if (include)
                {
                    members.Add(serializedMember);
                    continue;
                }

                //
                // 3.) Use class attributes
                if (classConfig != null)
                {
                    if (IsMatch(isField, isProp, isPublic, classConfig.TargetMembers))
                    {
                        members.Add(serializedMember);
                        continue;
                    }
                }

                //
                // 4.) Use global defaults
                if (IsMatch(isField, isProp, isPublic, defaultTargetMembers))
                {
                    members.Add(serializedMember);
                    continue;
                }
            }

            members.Sort(_memberComparer);

            return(members);
        }