使用反射的自定义验证属性

本文关键字:验证 属性 自定义 反射的 | 更新日期: 2023-09-27 18:25:37

我想使用System.ComponentModel.DataAnnotations程序集来验证我正在开发的控制台应用程序的参数(映射到属性)。我将使用"buddy-class"元数据模式;它过去对我很有效。

我需要验证的一件事是,提供了两种类型的参数中的一种。换句话说,可以指定参数foo或参数bar,但不能同时指定两者,也不能同时指定二者。

为此,我开始编写一个自定义验证属性,这看起来相当简单,但当我意识到我需要访问验证上下文的属性之外,并遍历到我正在验证的对象中的兄弟属性(如CompareAttribute)时,我有点不知所措。这似乎是一个典型的反思案例,但我正在为如何继续下去而挠头。这就是我目前所拥有的:

/// <summary>
/// This property, or the other specified, are required, but both cannot be set.
/// </summary>
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
public class XORAttribute : ValidationAttribute
{
    /// <summary>
    /// If validation should fail, return this error message.
    /// </summary>
    public string ErrorMessage { get; set; }
    /// <summary>
    /// The name of the other required property that is mutually exclusive of this one.
    /// </summary>
    public string OtherValueName { get; set; }
    public XORAttribute(string otherValueName)
    {
        this.OtherValueName = otherValueName;
    }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        //Something needs to go here.
    }
}

在此提供一些帮助将不胜感激。

使用反射的自定义验证属性

用属性检查其他属性并不是那么容易。这里的其他人也问了同样的问题(如本链接所示),答案是,嗯,不是很漂亮。这里的另一个答案建议使用IDataErrorInfo来执行全类验证。