Передать свойство универсального класса в качестве параметра в 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 быть именем свойства в виде строки.

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