示例#1
0
        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);
        }
示例#2
0
        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);
        }