繁体   English   中英

将通用类的属性作为参数传递给AutoMoq

[英]Pass property of generic class as parameter in AutoMoq

我想做的是概括使用AutoFixture和Moq制作存储库。 我有一个称为“添加”的方法,可将伪造的记录添加到列表中。 该列表称为记录,对于该类而言是全局的。 通用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;
}

与扩展类(我发现这样搜索):

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中”。

我的问题是:当模型在编译时未知时,如何传递通用对象的属性作为方法的参数?

With方法需要Expression<Func<T, TProperty>>参数而不是PropertyInfo

您可以将add方法更改为采用Expression<Func<T, TProperty>>而不是string:

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");

非常感谢Arkadiusz的正确答案。 我只想添加此方法(该方法受几个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);
}

然后,在add方法中,我将propertyPicker更改为makeExpression(property,val)property是字符串形式的属性名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM