Использование NBuilder On Collection

Я нашел эту реализацию 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 ответ

Похоже, Build метод, который вы пытаетесь вызвать, требует параметров, но вы ничего не передаете при вызове buildMethodInfo.Invoke(objectBuilder, null);

Исключением является TargetParameterCountException. Из MSDN:

Исключение, которое выдается, когда число параметров для вызова не соответствует ожидаемому числу.

Вам следует пройтись по коду с помощью отладчика и проверить прототип вызываемого метода, чтобы увидеть, какие параметры он принимает. Учитывая ваш комментарий, что та же самая проблема замечена, когда Build Метод вызывается по-разному (без параметров, переданных ему), подразумевается, что для реализации этого метода требуется один или несколько параметров.

В качестве альтернативы, вы можете попробовать вызвать метод статически, а не с помощью отражения, просто чтобы убедиться, что он может быть вызван так, как Invoke зовет это.

Другие вопросы по тегам