當@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'語句並強制實施新的開發人員實踐......也許我可以做一些代碼轉換,但這可能會導致[可能]評估斷言條件表達式的不必要成本(可能在特殊的「真正的調試」構建?) –