NBuilder在收集上的用法

时间:2014-09-12 21:08:31

标签: c# .net reflection mocking nbuilder

我在这里找到了NBuilder的这个实现: https://gist.github.com/markgibaud/4150878

这就像一个魅力,直到我需要在里面添加一些集合 例如:

public class UserDto
{
    public string UserName {get;set;}
    public List<AddressDto> Addresses {get;set;} //this will be null
}

public class AddressDto
{
    public string Street {get;set;}
    //...
}

我想用至少一条记录来填充任何收藏。

我最终得到了这段代码:

private static object BuildObjectList(Type type)
    {
        try
        {
            var builderClassType = typeof (Builder<>);
            Type[] args = {type};
            var genericBuilderType = builderClassType.MakeGenericType(args);
            var builder = Activator.CreateInstance(genericBuilderType);

            var createListOfSizeMethodInfo = builder.GetType().GetMethod("CreateListOfSize", new[] {typeof (int)});

            var objectBuilder = createListOfSizeMethodInfo.Invoke(builder, new object[] {1});
            var buildMethodInfo = objectBuilder.GetType().GetMethod("Build");
            return buildMethodInfo.Invoke(objectBuilder, null);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            return null;
        }
    }

但是当我尝试调用构建方法时,也存在一些问题。

1 个答案:

答案 0 :(得分:0)

您尝试调用的Build方法看起来需要参数,但是当您致电buildMethodInfo.Invoke(objectBuilder, null);

时,您并未传递任何内容

抛出的异常是TargetParameterCountException。来自MSDN:

  

当一个参数的数量时抛出的异常   调用与预期的数字不匹配。

您应该使用调试器逐步执行代码并检查正在调用的方法的原型以查看它所采用的参数。考虑到您的注释,当以不同的方式调用Build方法时(没有传递任何参数),可以看到相同的问题,这意味着此方法的实现需要一个或多个参数。

或者,您可以尝试静态调用该方法,而不是通过反射,只是为了确保可以Invoke调用它的方式调用它。