我正在为一款软件构建工具,并希望能够在 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/