private object SetFieldsAndProps(Type t, object obj, ParameterInfo[] pInfos) { MemberInfo[] fieldsAndProps = t.GetFields(); fieldsAndProps = fieldsAndProps.Concat(t.GetProperties(BindingFlags.Instance | BindingFlags.Public)).ToArray(); foreach (MemberInfo mi in fieldsAndProps) { if (pInfos.ToList().Find(pi => pi.Name == mi.Name) == null && IsDefaultValue(obj, mi)) { FakerConfig.Rule rule = config?.Rules.Find(Rule => (Rule.MemberName == mi.Name)); if (rule != null) { if (mi is FieldInfo fi && fi.FieldType == rule.MemberType) { fi.SetValue(obj, (Activator.CreateInstance(rule.GeneratorType) as IGenerator).Generate(new GeneratorContext(rule.MemberType))); } else if ((mi as PropertyInfo).PropertyType == rule.MemberType && (mi as PropertyInfo).CanWrite) { (mi as PropertyInfo).SetValue(obj, (Activator.CreateInstance(rule.GeneratorType) as IGenerator).Generate(new GeneratorContext(rule.MemberType))); } } else { (mi as FieldInfo)?.SetValue(obj, Create(((FieldInfo)mi).FieldType)); if ((mi as PropertyInfo)?.CanWrite == true && (mi as PropertyInfo)?.SetMethod.IsPublic == true) { ((PropertyInfo)mi).SetValue(obj, Create(((PropertyInfo)mi).PropertyType)); } } } }
private (object, ParameterInfo[]) CreateObject(Type t) { ConstructorInfo[] ctors = t.GetConstructors(); if (ctors.Length == 0 && t.IsClass) { return(null, null); } ctors.OrderByDescending(ci => ci.GetParameters().Length); object obj = null; ParameterInfo[] ctorParamInfos = null; foreach (ConstructorInfo ctor in ctors) { ParameterInfo[] parametersInfo = ctor.GetParameters(); object[] parameters = new object[parametersInfo.Length]; for (int i = 0; i < parameters.Length; i++) { FakerConfig.Rule rule = config?.Rules.Find(Rule => (Rule.MemberType == parametersInfo[i].ParameterType && Rule.MemberName == parametersInfo[i].Name)); if (rule != null) { parameters[i] = (Activator.CreateInstance(rule.GeneratorType) as IGenerator).Generate(new GeneratorContext(rule.MemberType)); } else { parameters[i] = Create(parametersInfo[i].ParameterType); } } try { obj = ctor.Invoke(parameters); ctorParamInfos = parametersInfo; break; } catch { continue; } } if (obj == null && t.IsValueType) { try { return(Activator.CreateInstance(t), new ParameterInfo[0]); } catch { return(null, null); } } else if (obj == null) { return(null, null); } return(obj, ctorParamInfos); }