Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用表达式编写自己的断言函数_C#_Lambda_Expression - Fatal编程技术网

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()
可能会给你更多,但我不能肯定。