C# 是否可以检查一个简单表达式是否总是返回true?

C# 是否可以检查一个简单表达式是否总是返回true?,c#,unit-testing,lambda,expression-trees,C#,Unit Testing,Lambda,Expression Trees,我的意思是最简单的方式。假设您有一个具有以下签名的函数: public static Expression<Func<T, bool>> CreateExpression<T>(string value) { // ... } 这是我可以创建单元测试的东西吗?当我发送null作为值时,我确实会返回一个常量true表达式?据我所知,没有办法这样做。但是,如果您愿意重构一点: class Sample<T> { public stat

我的意思是最简单的方式。假设您有一个具有以下签名的函数:

public static Expression<Func<T, bool>> CreateExpression<T>(string value)
{
    // ...
}

这是我可以创建单元测试的东西吗?当我发送
null
作为值时,我确实会返回一个常量true表达式?

据我所知,没有办法这样做。但是,如果您愿意重构一点:

class Sample<T>
{
    public static Func<T, bool> Identity = x => true;

    public static Func<T, bool> CreateExpression(string value)
    {
        if(value == "foo")
            return Identity;

        return x => value.Length % 2 == 0;
    }
}

class Test
{
    public void DoTest()
    {
        Debug.Assert(Sample<string>.CreateExpression("foo") == Sample<string>.Identity);
    }
}
类示例
{
公共静态Func Identity=x=>true;
公共静态Func CreateExpression(字符串值)
{
如果(值=“foo”)
返回身份;
返回x=>value。长度%2==0;
}
}
课堂测试
{
公共空间DoTest()
{
Assert(Sample.CreateExpression(“foo”)==Sample.Identity);
}
}

准确测试该表达式将非常容易(主体将是一个
常量表达式
,值为
true
)。但是在一般情况下呢?不,太复杂了

static bool IsConstantTrue(LambdaExpression lambda)
{
    return lambda.Body.NodeType == ExpressionType.Constant
        && true.Equals(((ConstantExpression)lambda.Body).Value);
}

表达式exp=x=>true;//或者某种方法 //返回lambda表达式 Assert.IsTrue(IsConstantTrue(exp)); 这里的“简单”是什么意思?这是一个模糊的术语


总的来说,我们唯一可以回避的是,这是另一种表现形式。考虑一下,你如何确定函数的结果,直到所有可能的参数,除非你真的在所有可能的参数下运行它?除了实际上不可行之外,由于停止问题的性质,你甚至不能保证结果(你甚至不知道该方法将终止,或者它在不确定的将来可能会走什么路)。

这听起来像是一个停止类型的问题,在这种情况下,对于一般表达式来说是不可能的,一般来说,是的。但在这种情况下,我知道我输入了什么值,在什么情况下我应该返回一个简单的“true”。这应该是一个简单的表达。。。我想说,至少基本上是这样?这有点让人困惑。。。你想测试什么?函数的结果是什么?你能返回一个对象或一个命名函数吗?“如果你的兄弟看起来总是对“你想要另一个cookie吗?”的问题回答“是”,他会对这个问题回答“好的,这个例子可能不是很好,因为TSource和TValue以及选择器等等。我会简化它。我要做的就是创建一个方法,该方法接受一个范围(a到b),然后创建一个表达式来检查某个东西(选择器)是否在a和b之间。但是,如果a和b都为null,它应该只返回true。因为在这种情况下,我认为范围是一个开放范围涵盖一切。希望这有点道理…:这就是我想的,是的。你能举个例子说明你是如何为一个表达式编写测试的吗?这也是一个很好的主意,但是这个方法不是一个类的一部分,在这个类中,像这样的身份是最好的。但是向上投票,因为这可能在其他时间有用:)但是当你有表达式树时,你可以检查它是否是一个常量表达式。我想您甚至应该能够扫描整个表达式树,并检查传入的参数是否从未真正使用过。但那只是我的想法。对表达式树了解不够:pOh,在这种情况下,它只是一个常量,没有条件逻辑/循环或其他任何东西,您应该是安全的。我不确定你的意思,不用担心。如果有人想知道,我将把这个答案留在这里只是为了理论上的证明。。。
static bool IsConstantTrue(LambdaExpression lambda)
{
    return lambda.Body.NodeType == ExpressionType.Constant
        && true.Equals(((ConstantExpression)lambda.Body).Value);
}
Expression<Func<SomeType, bool>> exp = x => true; // or some method that 
                                                  // returns a lambda expression
Assert.IsTrue(IsConstantTrue(exp));