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

时间:2017-02-03 15:46:10

标签: c# arrays data-annotations

我正在编码实体框架模型,我想根据预定义的允许值列表验证给定属性的传入数据。根据之前的研究,我决定最好的方法是通过自定义数据注释属性,确保需要此验证的每个属性都有一个附加的值数组,传递给此属性,称为“[AllowableValue]”< / p>

所以我有以下课程:

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]属性时,它给出了错误:“非静态字段,方法或属性'className.ListOfAllowableValues'需要对象引用。” p>

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

2 个答案:

答案 0 :(得分:1)

这是不可能的。 见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; }

答案 1 :(得分:1)

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

因此,您处于静态环境中且没有classname实例。但ListOfAllowableValues不是static而是实例成员,因此如果没有classname实例,则无法访问它(这就是错误意味着&#34;对象引用&#34;)。

不幸的是,我认为让ListOfAllowableValues static无法提供帮助,因为属性的参数无论如何都必须是编译时间常量,并且引用类型值不能是编译时间常量。