Использование 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
зовет это.