自定义属性要求对象引用,而不是数组
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?
您唯一的方法是执行以下操作:
[Required]
[AllowableValues(new[]{ "00", "77", "ZZ"})]
[MaxLength(2), MinLength(2)]
public string propertyName { get; set; }
属性声明必须是编译时常量。
因此您处于静态上下文中并且没有 classname
的 实例 。但是 ListOfAllowableValues
不是 static
而是实例成员,因此如果没有 classname
实例就无法访问它(这就是 "object reference" 的错误含义)。
不幸的是,我猜 ListOfAllowableValues
static
无济于事,因为属性的参数无论如何都必须是编译时常量,而引用类型值不能是编译时常量。
我正在编写 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?
您唯一的方法是执行以下操作:
[Required]
[AllowableValues(new[]{ "00", "77", "ZZ"})]
[MaxLength(2), MinLength(2)]
public string propertyName { get; set; }
属性声明必须是编译时常量。
因此您处于静态上下文中并且没有 classname
的 实例 。但是 ListOfAllowableValues
不是 static
而是实例成员,因此如果没有 classname
实例就无法访问它(这就是 "object reference" 的错误含义)。
不幸的是,我猜 ListOfAllowableValues
static
无济于事,因为属性的参数无论如何都必须是编译时常量,而引用类型值不能是编译时常量。