CallerArgumentExpression 与精确错误诊断
利用编译器生成的表达式信息在断言/验证中输出参数原始代码文本 · 难度:入门 · +10XP
CallerArgumentExpression 与精确错误诊断
CallerArgumentExpressionAttribute(C# 10)允许方法获取调用处某个参数的原始表达式字符串。区别于 CallerMemberName,它捕获的是源代码文本。本教程将用它构建极简的 Fluent 断言库,当条件失败时自动输出类似 “Expected x to be greater than 0 but was -5” 的详细错误,且表达式直接从调用点抓取。还会探讨 ASP.NET Core 的验证中间件如何利用此特性生成精确的模型绑定错误消息,以及它如何在编译时被替换为字符串字面量。
public static void Ensure<T>(T value, Func<T, bool> predicate,
[CallerArgumentExpression("value")] string expr = null)
{
if (!predicate(value))
throw new ArgumentException($"'{expr}' failed validation");
}
// 调用
Ensure(age, a => a >= 0); // 抛出: 'age' failed validation