用表达式编写自己的断言函数

时间:2015-03-11 11:05:45

标签: c# lambda expression

我想创建自己的Assert方法,类似于下面的代码,但它不起作用。

// Method Usage
Argument.Assert(() => Measurements.Count > 0);

// Method Implementation
public static void Assert(Expression<bool> expression)
{
  bool value = expression.Compile();
  if(!value)
  {
    throw new InvalidOperationException("Assert: " + expression.ToString() + " may not be false!");
  }
}

我在这里做错了什么?错误是:'Error 1 Cannot convert lambda to an expression tree whose type argument 'bool' is not a delegate type'

首先我有Expression<Func<bool>> expressionexpression.Compile()()但这总是与TargetInvocationException崩溃。

2 个答案:

答案 0 :(得分:5)

Expression<bool>无效,因为T必须是委托类型。 Expression<Func<bool>>有效,但我不确定为什么你更喜欢简单的Func<bool>。那是你的电话。

这应该有效

public static void Assert(Expression<Func<bool>> expression)
{
    if (!expression.Compile().Invoke())
    {
        throw new InvalidOperationException(String.Format("Assert: {0} may not be false!", expression.ToString()));
    }
}

答案 1 :(得分:2)

这样可行:

public static void Assert(Expression<Func<bool>> expression)
{
    if (!expression.Compile().Invoke())
    {
        throw new InvalidOperationException("Assert: " + expression.ToString() + " may not be false!");
    }
}