[英]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.