用表达式编写自己的断言函数
Write own assert Function with expressions
我想创建自己的 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>> expression
和 expression.Compile()()
但这总是因 TargetInvocationException
而崩溃。
这可行:
public static void Assert(Expression<Func<bool>> expression)
{
if (!expression.Compile().Invoke())
{
throw new InvalidOperationException("Assert: " + expression.ToString() + " may not be false!");
}
}
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()));
}
}
我想创建自己的 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>> expression
和 expression.Compile()()
但这总是因 TargetInvocationException
而崩溃。
这可行:
public static void Assert(Expression<Func<bool>> expression)
{
if (!expression.Compile().Invoke())
{
throw new InvalidOperationException("Assert: " + expression.ToString() + " may not be false!");
}
}
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()));
}
}