【问题标题】:nBuilder Testdatagenerator and ReflectionnBuilder 测试数据生成器和反射
【发布时间】:2012-05-22 19:34:03
【问题描述】:

我正在使用 nBuilder 为我的应用程序生成一些测试数据。 首先我对其进行了测试,它运行良好。 一个简单的例子:

Customer customer = Builder<Customer>
                   .CreateNew()
                   .Build();

创建一个对象并自动填充所有属性。 例如,如果 customer 包含属性:name,它将用 name1 填充 等等……

好吧,这一切都很好,但我现在很难动态地完成整个事情。

我现在正在做的是反射,我正在遍历我的类中的所有实体,并且 foreach 应该生成一些测试数据,甚至应该填充查找和子列表,但这不是问题.. 我的问题是,我如何将 above 代码与 any 类型一起使用?

ANYTYPE object = Builder&lt;ANYTYPE&gt; ...

我尝试了什么:

object entity = null; //The object/Entity
Assembly assembly = Assembly.GetAssembly(typeof(EMI_ERPContext)); //Getting Assembly
Type type = assembly.GetType(entityName); //I know the Type
//entity = Activator.CreateInstance(type); Do I must create an Instance here?
object entity = Builder<dynamic> //The above code.. Tried to put dynamic as Type, but doesnt work
               .CreateNew()
               .Build();

【问题讨论】:

    标签: c# reflection entity-framework-4 test-data


    【解决方案1】:

    我使用控制台应用程序(在此处完成)进行了测试,伪造了 nBuilder 的类/接口/方法。

    所以这是可行的,但没有在实际环境中尝试过。

    您可以重复使用的方法是“TryToReflectBuilder”。它可能不那么冗长,但我让“逐步”代码,因为它可能更明确。 ReflectionConsole.Test 用作“要反映的实体”。

    namespace ReflectionConsole {
        class Program {
            static void Main(string[] args)
            {
    
                object test = TryToReflectBuilder("ReflectionConsole.Test");
                Console.ReadKey();
            }
    
            public static object TryToReflectBuilder(string type)
            {
                //getting the assembly : not same as your way, but... that wasn't a problem for you
                var assembly = Assembly.GetAssembly(typeof(Test));
    
                //getting the entityType by name.
                var entityType = assembly.GetType(type);
    
                //The interesting (I hope) part is starting (yeah)
                //get the Builder<T> type
                var builderClassType = typeof(Builder<>);
    
                //create generic argument for Builder<T> will take the type of our entity (always an array)
                Type[] args = {entityType};
    
                //pass generic arguments to Builder<T>. Which becomes Builder<entityType>
                var genericBuilderType = builderClassType.MakeGenericType(args);
    
                //create a new instance of Builder<entityType>
                var builder = Activator.CreateInstance(genericBuilderType);
    
                //retrieve the "CreateNew" method, which belongs to Builder<T> class
                var createNewMethodInfo = builder.GetType().GetMethod("CreateNew");
    
                //invoke "CreateNew" from our builder instance which gives us an ObjectBuilder<T>, so now an ObjectBuilder<entityType> (well as an ISingleObjectBuilder<entityType>, but... who minds ;))
                var objectBuilder = createNewMethodInfo.Invoke(builder, null);
    
                //retrieve the "Build" method, which belongs to ObjectBuilder<T> class
                var buildMethodInfo = objectBuilder.GetType().GetMethod("Build");
    
                //finally, invoke "Build" from our ObjectBuilder<entityType> instance, which will give us... our entity !
                var result = buildMethodInfo.Invoke(objectBuilder, null);
    
                //it would be sad to return nothing after all these efforts, no ??
                return result;
            }
        }
    
        public  class Builder<T>
        {
            public static ISingleObjectBuilder<T> CreateNew()
            {
                Console.WriteLine(string.Format("{0} creating new",typeof(T)));
                return new ObjectBuilder<T>();
            } 
        }
    
        public interface ISingleObjectBuilder<T> : IBuildable<T>
        {
        }
        public interface IObjectBuilder<T> : ISingleObjectBuilder<T>
        {
    
        }
        public interface IBuildable<T>
        {
            T Build();
        }
    
        public class ObjectBuilder<T> : ISingleObjectBuilder<T>
        {
            public T Build()
            {
                Console.WriteLine(string.Format("{0} building myself", typeof(T)));
                return Activator.CreateInstance<T>();
            }
        }
    
        public class Test
        {
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多