【问题标题】:Custom Attribute is asking for an object reference, not array自定义属性要求对象引用,而不是数组
【发布时间】:2017-02-04 00:26:10
【问题描述】:

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

所以我有以下课程:

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' 需要对象引用。”

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

【问题讨论】:

  • 这比第一个答案提供的信息多一点。您能否将此评论移至答案部分,以便我接受?
  • 移动了它,但很抱歉它并没有真正解决您的问题。

标签: c# arrays data-annotations


【解决方案1】:

属性声明必须是编译时间常数

所以您处于静态上下文中并且没有classname实例。但是ListOfAllowableValues 不是static 而是一个实例成员,因此如果没有classname 实例,您将无法访问它(这就是“对象引用”的错误含义)。

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

【讨论】:

  • 谢谢。这个答案确实让我更好地了解为什么这是不可能的,所以我接受了这个。非常感谢。
【解决方案2】:

这是不可能的。 请参阅此处

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; }

【讨论】:

  • 有用的信息。但是对此的要求意味着当应用于其他属性时,允许值的列表可能会变得非常很大。我希望能够传递一个数组以使其更具可读性。看起来我将不得不通过控制器代码来做到这一点。不过谢谢。
猜你喜欢
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2012-07-08
  • 2018-07-04
  • 1970-01-01
相关资源
最近更新 更多