demo.sinch.com.Areas.HelpPage.SampleGeneration.ObjectGenerator.GenerateGenericType C# (CSharp) Method

GenerateGenericType() private static method

private static GenerateGenericType ( Type type, int collectionSize, object>.Dictionary createdObjectReferences ) : object
type System.Type
collectionSize int
createdObjectReferences object>.Dictionary
return object
        private static object GenerateGenericType(Type type, int collectionSize,
            Dictionary<Type, object> createdObjectReferences) {
            var genericTypeDefinition = type.GetGenericTypeDefinition();
            if (genericTypeDefinition == typeof (Nullable<>))
            {
                return GenerateNullable(type, createdObjectReferences);
            }

            if (genericTypeDefinition == typeof (KeyValuePair<,>))
            {
                return GenerateKeyValuePair(type, createdObjectReferences);
            }

            if (IsTuple(genericTypeDefinition))
            {
                return GenerateTuple(type, createdObjectReferences);
            }

            var genericArguments = type.GetGenericArguments();
            if (genericArguments.Length == 1)
            {
                if (genericTypeDefinition == typeof (IList<>) ||
                    genericTypeDefinition == typeof (IEnumerable<>) ||
                    genericTypeDefinition == typeof (ICollection<>))
                {
                    var collectionType = typeof (List<>).MakeGenericType(genericArguments);
                    return GenerateCollection(collectionType, collectionSize, createdObjectReferences);
                }

                if (genericTypeDefinition == typeof (IQueryable<>))
                {
                    return GenerateQueryable(type, collectionSize, createdObjectReferences);
                }

                var closedCollectionType = typeof (ICollection<>).MakeGenericType(genericArguments[0]);
                if (closedCollectionType.IsAssignableFrom(type))
                {
                    return GenerateCollection(type, collectionSize, createdObjectReferences);
                }
            }

            if (genericArguments.Length == 2)
            {
                if (genericTypeDefinition == typeof (IDictionary<,>))
                {
                    var dictionaryType = typeof (Dictionary<,>).MakeGenericType(genericArguments);
                    return GenerateDictionary(dictionaryType, collectionSize, createdObjectReferences);
                }

                var closedDictionaryType = typeof (IDictionary<,>).MakeGenericType(genericArguments[0],
                    genericArguments[1]);
                if (closedDictionaryType.IsAssignableFrom(type))
                {
                    return GenerateDictionary(type, collectionSize, createdObjectReferences);
                }
            }

            if (type.IsPublic || type.IsNestedPublic)
            {
                return GenerateComplexObject(type, createdObjectReferences);
            }

            return null;
        }