我正在编码实体框架模型,我想根据预定义的允许值列表验证给定属性的传入数据。根据之前的研究,我决定最好的方法是通过自定义数据注释属性,确保需要此验证的每个属性都有一个附加的值数组,传递给此属性,称为“[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>
我的定义需要一个数组,我传给它一个数组。为什么要求对象引用?
答案 0 :(得分:1)
这是不可能的。 见SO
Can I initialize a C# attribute with an array or other variable number of arguments?
您唯一的方法是执行以下操作:
[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
无法提供帮助,因为属性的参数无论如何都必须是编译时间常量,并且引用类型值不能是编译时间常量。