Передать свойство универсального класса в качестве параметра в AutoMoq
То, что я пытаюсь сделать, это обобщить создание репозиториев с использованием AutoFixture и Moq. У меня есть метод add, который добавляет фальшивые записи в список. Список называется records и является глобальным для класса. Универсальный M - это модель, над которой нужно издеваться. Метод возвращает this, поэтому метод может быть связан.
public Repo<M> add(string prop, string val) {
var a = fixture.Build<M>().With(m => m.GetProperty(prop), val).Create();
records.Add(a);
return this;
}
с классом расширения (я нашел этот поиск SO):
public static class MyExtensions
{
public static object GetProperty<T>(this T obj, string name) where T : class
{
Type t = typeof(T);
return t.GetProperty(name).GetValue(obj, null);
}
}
Я получаю сообщение об ошибке "ArgumentException произошла в Ploeh.AutoFixture.dll".
Мой вопрос: как можно передать свойство универсального объекта в качестве параметра метода, если модель неизвестна во время компиляции?
2 ответа
With
метод требует Expression<Func<T, TProperty>>
параметр не PropertyInfo
,
Вы можете изменить свой add
метод взять Expression<Func<T, TProperty>>
вместо строки:
public Repo<M> add<T>(Expression<Func<M, T>> propertyPicker, T val)
{
var a = fixture.Build<M>().With(propertyPicker, val).Create();
records.Add(a);
return this;
}
и это использование:
add(foo => foo.Name, "abc");
Большое спасибо Аркадиушу за правильный ответ. Я просто хочу добавить этот метод, который я добавил (вдохновленный несколькими публикациями SO), чтобы создать выражение так, чтобы использование было:add("username","me")
private Expression<Func<M,T>> makeExpression<T>(string prop, T val)
{
var m = Expression.Parameter(typeof(M), "m");
Expression columnExpr = Expression.Property(m,typeof(M).GetProperty(prop));
return Expression.Lambda<Func<M, T>>(columnExpr, m);
}
Затем в методе добавления я изменил propertyPicker
в makeExpression(property,val)
, property
быть именем свойства в виде строки.