关于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
相关产品推荐
相关产品推荐

