private object[] GenerateConstructorParameters(ParameterInfo[] parameters, Type t) { if (parameters.Length == 0) { return(null); } List <object> generatedParameters = new List <object>(); bool canUseCustomGenerators = conf != null && conf.ClassHasCustomGenerators(t); foreach (ParameterInfo param in parameters) { if (canUseCustomGenerators) { if (conf.FieldOrPropertyHasCustomGenerator(t, AdditionalFunction.ProceedParameterName(param.Name), out IBaseGenerator g)) { generatedParameters.Add(g.Generate(new GeneratorContext(rand, param.ParameterType, this))); continue; } } else { try { generatedParameters.Add(Create(param.ParameterType)); } catch (ArgumentException) { generatedParameters.Add(null); } } } return(generatedParameters.ToArray()); }
private void FillObject(object obj) { Type type = obj.GetType(); FieldInfo[] fields = type.GetFields(); PropertyInfo[] properties = type.GetProperties(); bool canUseCustomGenerators = conf != null && conf.ClassHasCustomGenerators(obj.GetType()); foreach (FieldInfo field in fields) { if (!AdditionalFunction.IsFilled(field, obj)) { resolver.AddReference(field.FieldType, field); if (resolver.CanCreateAnObject(field.FieldType, field)) { if (canUseCustomGenerators && conf.FieldOrPropertyHasCustomGenerator(obj.GetType(), field.Name, out IBaseGenerator g)) { field.SetValue(obj, g.Generate(new GeneratorContext(rand, field.FieldType, this))); resolver.RemoveReference(field.FieldType, field); continue; } else { try { field.SetValue(obj, Create(field.FieldType)); } catch (ArgumentException) { field.SetValue(obj, null); } } } else { field.SetValue(obj, null); } resolver.RemoveReference(field.FieldType, field); } } foreach (PropertyInfo property in properties) { if (property.CanWrite && !AdditionalFunction.IsFilled(property, obj)) { resolver.AddReference(property.PropertyType, property); if (canUseCustomGenerators && conf.FieldOrPropertyHasCustomGenerator(obj.GetType(), property.Name, out IBaseGenerator g)) { property.SetValue(obj, g.Generate(new GeneratorContext(rand, property.PropertyType, this))); resolver.RemoveReference(property.PropertyType, property); continue; } else { try { property.SetValue(obj, Create(property.PropertyType)); } catch (ArgumentException) { property.SetValue(obj, null); } } resolver.RemoveReference(property.PropertyType, property); } } }