首页 > 解决方案 > 我想实现一个 linq 表达式,它允许我测试提供的对象上的属性

问题描述

我想从 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#linqexpressionmoq

解决方案


您想使用一个Expression<Func<>>参数,并检查它是否包含 aBody和 aMember类型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 指向一个属性。如果您想处理字段和方法,它们将作为不同类型的表达式出现,并且您需要稍微不同地处理它们。有关更多上下文和用法,这里有一个 Fiddle

编辑:更新以与其他属性类型一起使用。


推荐阅读