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

关于C#自定义ValidationAttribute的方法调用机制的技术问询

自定义ValidationAttribute的常见疑问解答

首先,创建自定义验证特性需要继承ValidationAttribute类,示例代码如下:

public class CustomAttribute: ValidationAttribute
{
    public void Test()
    {
         Console.WriteLine("Hello World");
     }
    public override bool IsValid(object? value)
    {
        // 验证逻辑
        if (condition)
        {
            return true;
        }
        else
            return false;
    }
}

将该特性应用到模型属性上时,特性类会被实例化:

[Custom]
public string username { get; set; }

针对你提出的三个疑问,解答如下:

1. IsValid()方法是如何以及何时被调用的?

IsValid方法由.NET的模型验证框架触发调用:

  • 调用时机:通常在模型绑定完成后自动触发,比如ASP.NET MVC/Web API接收HTTP请求(POST/PUT等)并完成参数绑定到模型对象时;或者你手动调用ModelState.IsValid、Validator.TryValidateObject这类验证方法时,也会触发。
  • 调用方式:框架会通过反射遍历模型属性上标记的所有ValidationAttribute实例,调用这些实例的IsValid方法并传入属性值作为参数,以此执行验证逻辑。

2. 为何CustomAttribute类中的其他方法(如Test()方法)不会被调用?

模型验证框架只遵循ValidationAttribute基类定义的约定方法(比如IsValid、FormatErrorMessage),Test()是你自定义的方法,框架没有任何逻辑会识别或调用它。特性本质是一种"标记",只有消费这个标记的代码(这里就是模型验证框架)明确指定要调用哪些方法时,对应的方法才会被执行;自定义方法除非你自己通过反射主动调用,否则不会自动执行。

3. 自定义特性类中的特定方法是基于什么依据被执行的?

方法是否被执行,完全取决于消费该特性的框架/代码所遵循的约定:

  • 比如ValidationAttribute所在的验证体系,约定了所有继承它的自定义特性,都通过IsValid方法实现验证逻辑,所以框架会主动调用这个方法。
  • 简单来说,谁使用这个特性,谁就定义了要调用哪些方法——这些方法一般是基类中定义的虚方法或抽象方法,子类重写后,框架按照基类的约定去触发调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:40:36