我想从MOQ实现这个方法。 (这里我的深度很少)
ISetup<T> Setup(Expression<Action<T>> expression);
public class Foo {
public string Bar { get; set; }
public int Baz { get; set; }
}
public class MyCoolClass
{
public ? Evaluate<Expression<Action>>(expression);
//I want to be able to access and test the value of Foo.Bar (see below)
}
public class ClientOfMyClass
{
public void UseTheMethod()
{
MyCoolClass myCool = new MyCoolClass();
bool result = myCool.Evaluate<Foo>(f => f.Bar);
}
}
基本上,我正在尝试编写一个方法,允许调用者使用表达式在对象上指定属性,并允许我测试该属性的值并对其执行某些操作。
你想使用Expression<Func<>>
参数,并检查它是否包含Body
和Member
类型的PropertyInfo
,并使用GetValue()
传递你的对象。
public static void Evaluate<TObj,TProp>(
this TObj obj,
Expression<Func<TObj, TProp>> expr)
{
var prop = (expr.Body as MemberExpression)?.Member as PropertyInfo;
var val = prop?.GetValue(obj);
if (val != null) {
//Do something
}
}
请注意,上面的代码要求传入的lambda指向一个Property。如果你想处理Fields和Methods,它们将作为不同类型的表达式出现,你将需要处理它们略有不同。有关更多背景和用法,here's a Fiddle。
编辑:已更新以使用其他属性类型。