C# 用表达式编写自己的断言函数
我想创建我自己的C# 用表达式编写自己的断言函数,c#,lambda,expression,C#,Lambda,Expression,我想创建我自己的Assert方法,类似于下面的代码,但它不起作用 //方法用法 Assert(()=>Measurements.Count>0); //方法实现 公共静态void断言(表达式) { bool value=expression.Compile(); 如果(!值) { 抛出新的InvalidOperationException(“断言:“+expression.ToString()+”不能为false!”); } } 我做错了什么?错误是:“错误1无法将lambda转换为类型参数“
Assert
方法,类似于下面的代码,但它不起作用
//方法用法
Assert(()=>Measurements.Count>0);
//方法实现
公共静态void断言(表达式)
{
bool value=expression.Compile();
如果(!值)
{
抛出新的InvalidOperationException(“断言:“+expression.ToString()+”不能为false!”);
}
}
我做错了什么?错误是:“错误1无法将lambda转换为类型参数“bool”不是委托类型的表达式树”
首先,我使用了Expression-Expression
和Expression.Compile()
public static void Assert(Expression<Func<bool>> expression)
{
if (!expression.Compile().Invoke())
{
throw new InvalidOperationException("Assert: " + expression.ToString() + " may not be false!");
}
}
publicstaticvoidassert(表达式)
{
如果(!expression.Compile().Invoke())
{
抛出新的InvalidOperationException(“断言:“+expression.ToString()+”不能为false!”);
}
}
表达式
无效,因为T必须是委托类型。
Expression
是有效的,尽管我不知道为什么您更喜欢它而不是简单的Func
。那是你的电话
这应该行得通
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()));
}
}
publicstaticvoidassert(表达式)
{
如果(!expression.Compile().Invoke())
{
抛出新的InvalidOperationException(String.Format(“断言:{0}可能不是false!”,expression.ToString());
}
}
很好地展示了targetingException
所展示的内容-使用表达式
肯定比实际上无效的表达式更合适。。。(Expression
仅在T
是委托类型时有效。)如果简单的委托
工作正常,为什么要使用表达式谢谢,这至少起作用了,但是输出看起来像:Assert:System.Func
1[System.Boolean]可能不是false`我正在尝试修复它。。。给我一个提示:公共静态void断言(表达式)
<代码>如果(!expression.Compile()())
@SirBirne是的,我当时在。。。但是我确信你想要“Measurement.Count>0”,对吗?我不想在这里记录东西,我还需要在发布版本中使用这些东西——我不想控制输出。不管怎样,谢谢,效果很好。很酷,我想会有更多的。我注意到您正在将表达式打印到异常消息中。我认为expression.ToString()
打印的内容不会比()=>False
打印的内容多得多expression.Body.ToString()
可能会给你更多,但我不能肯定。