当@vcsjones发布他的answer时,我已经开始输入答案,所以我放弃了我的,但我看到它的一些部分仍然相关。主要是关于将lambda表达式格式化为可读的内容,所以我会将他与我想要的答案的那部分合并。
它使用了许多正则表达式来设置断言表达式的格式,所以在很多情况下它看起来不错(即接近你输入的内容)。
对于@vcsjones给出的例子回答它现在看起来就像这样:
断言 '(I> 0)' 失败。
public static class DebugEx
{
private static readonly Dictionary<Regex, string> _replacements;
static DebugEx()
{
_replacements = new Dictionary<Regex,string>()
{
{new Regex("value\\([^)]*\\)\\."), string.Empty},
{new Regex("\\(\\)\\."), string.Empty},
{new Regex("\\(\\)\\ =>"), string.Empty},
{new Regex("Not"), "!"}
};
}
[Conditional("DEBUG")]
public static void Assert(Expression<Func<bool>> assertion, string message)
{
if (!assertion.Compile()())
Debug.Assert(false, message, FormatFailure(assertion));
}
private static string FormatFailure(Expression assertion)
{
return string.Format("Assertion '{0}' failed.", Normalize(assertion.ToString()));
}
private static string Normalize(string expression)
{
string result = expression;
foreach (var pattern in _replacements)
{
result = pattern.Key.Replace(result, pattern.Value);
}
return result.Trim();
}
}
也许创造一个表达,通过在表达式中断言,那么如果它没有从表达构建您的字符串。 – paqogomez
如果其中一个答案充分解决了您的问题,您可能需要选择它作为答案,以便可以从“未答复”列表中删除此问题。 – Alex
抱歉,延迟。尽管所有涉及传递表达式的答案都可以工作,但我不幸的是无法通过并更改许多现有的'Debug.Assert'语句并强制实施新的开发人员实践......也许我可以做一些代码转换,但这可能会导致[可能]评估断言条件表达式的不必要成本(可能在特殊的“真正的调试”构建?) –