ModelBuilder.EnumValueGenerator.GenerateValue C# (CSharp) Method

GenerateValue() protected method

protected GenerateValue ( Type type, string referenceName, LinkedList buildChain ) : object
type System.Type
referenceName string
buildChain LinkedList
return object
        protected override object GenerateValue(Type type, string referenceName, LinkedList<object> buildChain)
        {
            var generateType = type;

            if (generateType.IsNullable())
            {
                // Allow for a 10% the chance that this might be null
                var range = Generator.NextValue(0, 100);

                if (range < 10)
                {
                    return null;
                }

                // Hijack the type to generator so we can continue with the normal code pointed at the correct type to generate
                generateType = type.GetGenericArguments()[0];
            }

            var isFlags = generateType.GetCustomAttributes(typeof(FlagsAttribute), true).Any();

            var values = Enum.GetValues(generateType);

            if (values.Length == 0)
            {
                // Return the default value of the enum
                return Activator.CreateInstance(generateType);
            }

            if (values.Length == 1)
            {
                return values.GetValue(0);
            }

            if (isFlags)
            {
                // Build a bitwise value
                var flagCount = Generator.NextValue(1, values.Length);
                var parts = new List<string>();

                for (var index = 0; index < flagCount; index++)
                {
                    var nextIndex = Generator.NextValue(0, values.Length - 1);
                    var nextValue = values.GetValue(nextIndex);
                    var valueText = nextValue.ToString();

                    parts.Add(valueText);
                }

                var text = parts.Aggregate((x, y) => x + ", " + y);

                return Enum.Parse(generateType, text, true);
            }

            // This is not a flags enum so we will return a single value
            var valueIndex = Generator.NextValue(0, values.Length - 1);

            return values.GetValue(valueIndex);
        }
    }