public T Create <T>() { object obj = default(T); Type objectType = typeof(T); if (IsDto <T>()) { return((T)generators[objectType].Generate()); } if (IsGenericList <T>()) { var t = typeof(T).GetGenericArguments().Single(); MethodInfo method = typeof(ListGenerator).GetMethod(nameof(ListGenerator.GenerateGeneric)); MethodInfo generic = method.MakeGenericMethod(t); ListGenerator listGenerator = new ListGenerator(this); return((T)generic.Invoke(listGenerator, null)); } AddCreatedType(objectType); if (createdTypes[objectType] > RecursionLevel) { RemoveCreatedType(objectType); return(default(T)); } List <ConstructorInfo> constructors = GetSortedConstructors <T>(); if (constructors.Count == 0) { obj = (T)Activator.CreateInstance(objectType); FillObject <T>(ref obj, GetFieldsToFill <T>().ToArray()); RemoveCreatedType(objectType); return((T)obj); } foreach (ConstructorInfo constructor in constructors) { object[] parameters = FillConstructorParameters(constructor); try { obj = (T)constructor.Invoke(parameters); FillObject <T>(ref obj, GetFieldsToFill <T>().ToArray()); RemoveCreatedType(objectType); return((T)obj); } catch { continue; } } RemoveCreatedType(objectType); return((T)obj); }
public Faker() { generatedTypes = new List <Type>(); asm = Assembly.LoadFrom("Plugins\\GeneratorPlugins.dll"); // базовые типы baseTypesGenerators = new Dictionary <Type, IValueGenerator> { { typeof(object), new ObjectGenerator() }, { typeof(char), new CharGenerator() }, { typeof(bool), new BoolGenerator() }, { typeof(byte), new ByteGenerator() }, { typeof(sbyte), new SByteGenerator() }, { typeof(int), new IntGenerator() }, { typeof(uint), new UIntGenerator() }, { typeof(short), new ShortGenerator() }, { typeof(ushort), new UShortGenerator() }, { typeof(long), new LongGenerator() }, { typeof(ulong), new ULongGenerator() }, { typeof(decimal), new DecimalGenerator() }, { typeof(float), new FloatGenerator() }, { typeof(double), new DoubleGenerator() }, { typeof(DateTime), new DateGenerator() }, { typeof(string), new StringGenerator() } }; // плагины var types = asm.GetTypes().Where(t => t.GetInterfaces().Where(i => i == typeof(IPlugin)).Any()); foreach (var type in types) { var plugin = asm.CreateInstance(type.FullName) as IPlugin; if (!baseTypesGenerators.ContainsKey(plugin.GeneratedType)) { baseTypesGenerators.Add(plugin.GeneratedType, plugin); } } // list - genric type listGenerator = new ListGenerator(baseTypesGenerators); }