在 AutoMoq 中将通用 class 的 属性 作为参数传递
Pass property of generic class as parameter in AutoMoq
我想做的是概括使用 AutoFixture 和 Moq 制作存储库。我有一个名为 'add' 的方法,可以将虚假记录添加到列表中。该列表称为记录并且对 class 是全局的。通用 M 是要模拟的模型。方法 returns '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;
}
扩展名 class(我发现这个搜索 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 occurred in Ploeh.AutoFixture.dll"。
我的问题是:当编译时模型未知时,如何将通用对象的 属性 作为参数传递给方法?
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");
非常感谢 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);
}
然后,在添加方法中,我将 propertyPicker
更改为 makeExpression(property,val)
,property
是 属性 的字符串名称。
我想做的是概括使用 AutoFixture 和 Moq 制作存储库。我有一个名为 'add' 的方法,可以将虚假记录添加到列表中。该列表称为记录并且对 class 是全局的。通用 M 是要模拟的模型。方法 returns '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;
}
扩展名 class(我发现这个搜索 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 occurred in Ploeh.AutoFixture.dll"。
我的问题是:当编译时模型未知时,如何将通用对象的 属性 作为参数传递给方法?
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");
非常感谢 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);
}
然后,在添加方法中,我将 propertyPicker
更改为 makeExpression(property,val)
,property
是 属性 的字符串名称。