c# - 失败时获取 Debug.Assert 条件作为字符串

标签 c#

我正在为一款软件构建工具,并希望能够在 Debug.Assert(或 Trace.断言)调用。

例如,如果程序崩溃:

var x = -1;
Debug.Assert(x >= 0, "X must be non-negative", "some detail message");

我希望能够得到字符串 "x >= 0" 以及消息和详细消息。

我研究过使用 TraceListener , 但 TraceListener#Fail(string)TraceListener#Fail(string, string) 只能捕获消息和详细消息字段(如果开发人员不include,让我没有简单的方法来报告出了什么问题)。

我想可以创建堆栈跟踪并读取失败的特定行并报告(假设源代码可用),但这似乎相对脆弱。

感谢您的宝贵时间!

最佳答案

你可以使用表达式来完成一些粗略的事情:

public static class DebugEx
{
    [Conditional("DEBUG")]
    public static void Assert(Expression<Func<bool>> assertion, string message)
    {
        Debug.Assert(assertion.Compile()(), message, assertion.Body.ToString());
    }
}

然后像这样使用它:

var i = -1;
DebugEx.Assert(() => i > 0, "Message");

这有一些缺点。首先,您必须使用 lambda,这会使语法稍微复杂一点。第二个是因为我们正在动态编译东西,所以会影响性能。由于这只会在 Debug模式下发生(因此是有条件的),因此在 Release模式下不会看到性能损失。

最后,输出并不漂亮。它看起来像这样:

(value(WindowsFormsApplication1.Form1+<>c__DisplayClass0).i > 0)

对此您无能为力。发生这种情况的原因是 i 周围的闭包。这实际上是准确的,因为这就是它被编译成的内容。

关于c# - 失败时获取 Debug.Assert 条件作为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29777599/

相关文章:

c# - 使用 C# 并使用 foreach 从 JSON 字符串获取二级值

c# - 什么是System.Void?

c# - 如何增加 SQL 连接字符串的连接超时?

c# - 我在我的解决方案中添加了一个新的 XML 文件,但是当我按 F5 对其进行测试时,我在 Debug 文件夹中找不到 .xml 文件

c# - WPF ListView.ItemsSource 绑定(bind)问题

c# - 对包含唯一行的列表进行排序,并将给定行作为第一项,然后对列表重新排序,但不包含第一行

c# - 使用 ASP.net 打开与 MySQL 的连接

c# - 返回带有错误状态码 MVC 的 JSON

c# - 多条件验证有没有更优雅的方法

c# - 如何在 .net 4.5 中针对 AzureAD 实现 SAML2 身份验证? (消费代币)