自定义属性要求对象引用,而不是数组

Custom Attribute is asking for an object reference, not array

我正在编写 Entity Framework 模型,我想根据预定义的允许值列表验证给定 属性 的传入数据。根据之前的研究,我决定最好的方法是通过自定义数据注释属性,确保每个需要此验证的 属性 都有一个传递给该属性的值数组,称为“[允许值]"

所以我有以下 class:

public class className
{
    public int Id { get; set; }

    [Required]
    [AllowableValues(ListOfAllowableValues)]
    [MaxLength(2), MinLength(2)]
    public string propertyName { get; set; }

    [NotMapped]
    public string[] ListOfAllowableValues = new string[]
    {
        "00",
        "77",
        "ZZ"
    };

}

以及以下自定义属性:

public class AllowableValues : ValidationAttribute
{
    string[] _list;

    public AllowableValues(string[] list)
    {
        _list = list;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (_list.Contains((string)value))
            return ValidationResult.Success;
        return new ValidationResult("Invalid value.");
    }
}

但是,在 Visual Studio 中,当我应用 [AllowableValues] 属性时,出现错误:“非静态字段、方法或 [=26= 需要对象引用] 'className.ListOfAllowableValues.'

我的定义需要一个数组,我正在向它传递一个数组。为什么它要求对象引用?

这是不可能的。 在 SO

上查看这里

Can I initialize a C# attribute with an array or other variable number of arguments?

如何: MSDN CustomAttributes

您唯一的方法是执行以下操作:

[Required]
[AllowableValues(new[]{ "00", "77", "ZZ"})]
[MaxLength(2), MinLength(2)]
public string propertyName { get; set; }

属性声明必须是编译时常量

因此您处于静态上下文中并且没有 classname 实例 。但是 ListOfAllowableValues 不是 static 而是实例成员,因此如果没有 classname 实例就无法访问它(这就是 "object reference" 的错误含义)。

不幸的是,我猜 ListOfAllowableValues static 无济于事,因为属性的参数无论如何都必须是编译时常量,而引用类型值不能是编译时常量。