Beispiel #1
0
        /// <summary>
        /// Create prototypes for possible values of an entry
        /// </summary>
        private static IEnumerable <Entry> Prototypes(Type memberType, ICustomAttributeProvider customAttributeProvider, ICustomSerialization customSerialization)
        {
            var possibleElementValues = customSerialization.PossibleValues(memberType, customAttributeProvider);

            foreach (var prototype in customSerialization.Prototypes(memberType, customAttributeProvider))
            {
                var prototypeEntry = Prototype(prototype, customSerialization);
                prototypeEntry.Value.Possible = possibleElementValues;
                yield return(prototypeEntry);
            }
        }
        /// <see cref="ICustomSerialization"/>
        private static EntryValue CreateEntryValue(PropertyInfo property, ICustomSerialization customSerialization)
        {
            // Set if the current entry is readonly by checking if the property has a setter
            // or the ReadOnlyAttribute was set to true
            var isReadOnly = !property.CanWrite;

            if (!isReadOnly)
            {
                var readOnlyAtt = property.GetCustomAttribute <ReadOnlyAttribute>();
                isReadOnly = readOnlyAtt?.IsReadOnly ?? false;
            }

            // Prepare object
            var entryValue = new EntryValue
            {
                Type       = TransformType(property.PropertyType),
                UnitType   = customSerialization.GetUnitTypeByAttributes(property),
                IsReadOnly = isReadOnly,
                Possible   = customSerialization.PossibleValues(property.PropertyType, property)
            };

            // Get most basic default
            var defaultAttribute = property.GetCustomAttribute <DefaultValueAttribute>();

            if (defaultAttribute != null)
            {
                entryValue.Default = defaultAttribute.Value.ToString();
            }
            else if (entryValue.Possible != null && entryValue.Possible.Length >= 1)
            {
                entryValue.Default = entryValue.Possible[0];
            }
            else if (property.PropertyType.IsValueType)
            {
                entryValue.Default = Activator.CreateInstance(property.PropertyType).ToString();
            }

            // Value types should have the default value as current value
            if (ValueOrStringType(property.PropertyType))
            {
                entryValue.Current = ConvertToString(entryValue.Default, customSerialization.FormatProvider);
            }

            return(entryValue);
        }
        /// <summary>
        /// Convert a method parameter to our standard <see cref="Entry"/> format
        /// </summary>
        private static Entry ConvertParameter(ParameterInfo parameter, ICustomSerialization serialization)
        {
            var parameterType = parameter.ParameterType;
            var defaultValue  = parameter.HasDefaultValue ? parameter.DefaultValue.ToString() : null;

            var parameterModel = new Entry
            {
                DisplayName = parameter.GetDisplayName() ?? parameter.Name,
                Identifier  = parameter.Name,
                Description = parameter.GetDescription(),
                Value       = new EntryValue
                {
                    Type     = TransformType(parameter.ParameterType),
                    UnitType = serialization.GetUnitTypeByAttributes(parameter),
                    Current  = defaultValue,
                    Default  = defaultValue,
                    Possible = serialization.PossibleValues(parameterType, parameter)
                },
                Validation = serialization.CreateValidation(parameterType, parameter)
            };

            switch (parameterModel.Value.Type)
            {
            case EntryValueType.Class:
                parameterModel.Value.Current = parameterType.Name;
                parameterModel.Prototypes.AddRange(Prototypes(parameterType, parameter, serialization));
                parameterModel.SubEntries = EncodeClass(parameterType, serialization).SubEntries;
                break;

            case EntryValueType.Collection:
                var elemType = ElementType(parameterType);
                parameterModel.Value.Current = elemType.Name;
                parameterModel.Prototypes.AddRange(Prototypes(parameterType, parameter, serialization));
                break;
            }

            return(parameterModel);
        }