我想实现一个linq表达式,它允许我测试提供的对象上的属性

问题描述 投票:1回答:1

我想从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);
        }
    }

基本上,我正在尝试编写一个方法,允许调用者使用表达式在对象上指定属性,并允许我测试该属性的值并对其执行某些操作。

c# linq expression moq
1个回答
0
投票

你想使用Expression<Func<>>参数,并检查它是否包含BodyMember类型的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

编辑:已更新以使用其他属性类型。

© www.soinside.com 2019 - 2024. All rights reserved.