You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让自定义断言类函数具备参数名识别与校验特性?

在C# 9中为自定义断言类实现参数名校验提示

问题场景

创建ArgumentException时,若直接传入字符串形式的参数名:

throw new ArgumentException("That's a stupid name", "userName");

IDE会给出两个提示:一是建议用nameof表达式引用参数名,二是如果传入的字符串和当前函数参数不匹配,会弹出“无法解析符号'XXX'”的警告。我想在自己写的断言类函数里实现同样的行为,但找不到对应的特性,且CallerArgumentExpressionAttribute是C# 10特性,当前只能用C# 9。

实现方法

在C# 9里,无需额外特性,靠IDE默认的代码分析规则就能实现类似效果,步骤如下:

1. 编写断言方法

定义断言方法时,明确接收待校验参数和参数名字符串,同时通过XML注释提示使用nameof:

public static class AssertHelper
{
    /// <summary>
    /// 校验参数不能为null
    /// </summary>
    /// <param name="value">待校验的参数值</param>
    /// <param name="paramName">待校验参数的名称,请使用nameof表达式传入</param>
    /// <exception cref="ArgumentException"></exception>
    public static void NotNull(object value, string paramName)
    {
        if (value == null)
        {
            throw new ArgumentException("参数不能为空", paramName);
        }
    }
}

2. 利用IDE默认规则

IDE默认启用了两个关键规则:

  • IDE0008:检测到直接用字符串字面量传参数名时,提示改用nameof表达式
  • CS0103:如果传入的字符串不是当前上下文中的有效参数名,会抛出“无法解析符号”的警告

这样当你调用AssertHelper.NotNull(user, "userName")时,如果当前方法没有userName这个参数,IDE会立刻报错;如果直接写字符串而非nameof(user),也会收到改用nameof的提示。

进阶:自定义代码分析器(可选)

如果需要更严格的校验,可以自己编写Roslyn代码分析器:

  • 自定义一个特性标记接收参数名的参数
  • 编写分析逻辑,检查传入的字符串是否对应有效参数名,以及是否使用nameof
  • 将分析器集成到项目中,实现更精准的提示

不过对于常规场景,依赖IDE默认规则已经完全够用,不需要额外开发分析器。

内容的提问来源于stack exchange,提问作者dwilliss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:05:21