public object Create(Type type) { if (generationStack.Contains(type)) { return(null); } if (type.IsAbstract || type.IsInterface || type == typeof(void)) { return(null); } IGenerator value; Generators.TryGetValue(type, out value); if (value != null) { return(value.Generate()); } if (type.IsGenericType) { Type t = type.GetType(); return(listGenerator.Generate((Type)type.GenericTypeArguments.GetValue(0))); } if (!type.IsAbstract || !type.IsPrimitive) { generationStack.Push(type); ConstructorInfo ConstructorWithMaxArgs = GetConstructorWithMaxParams(type); if (ConstructorWithMaxArgs != null) { var instance = GenerateObjectFromConstructor(ConstructorWithMaxArgs); instance = GenerateFieldsAndProperties(type, instance); generationStack.Pop(); return(instance); } else { if (type.GetConstructors().Count() != 0) { var instance = Activator.CreateInstance(type); instance = GenerateFieldsAndProperties(type, instance); generationStack.Pop(); return(instance); } else { return(null); } } } return(null); }
public object Create <T>() { var type = typeof(T); if (_exludedTypes.Contains(type)) { return(null); } _exludedTypes.Add(type); if (type.IsAbstract || type.IsInterface || type.IsPointer) { return(null); } if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List <>)) { var listGenerator = new ListGenerator(); _exludedTypes.Remove(type); return((T)listGenerator.Generate(type.GetGenericArguments()[0])); } if (_generators.TryGetValue(type, out var generator)) { _exludedTypes.Remove(type); return((T)generator.Generate(type)); } if (type.IsClass && !type.IsGenericType) { var instance = InitializeWithConstructor(type); if (instance != null) { FillObject(instance); } _exludedTypes.Remove(type); return(instance); } if (type.IsValueType && !type.IsGenericType) { var instance = default(T); if (instance != null) { FillObject(instance); _exludedTypes.Remove(type); return(instance); } } _exludedTypes.Remove(type); return(default(T)); }