自定义";至少“;属性

本文关键字:属性 至少 自定义 quot | 更新日期: 2023-09-27 18:21:32

我正在尝试创建一个属性来验证我的模型。

在我的模型中,我有一个列表。该列表必须具有确定数量的符合条件的项目,如"至少1个活动项目"或"至少1名以"John"为名称的活动项目"。

我的代码是这样的:

public class Foo
{
    [AtLeast(1, new Tuple<string, object>("Active", true))]
    public List<Item> ListOfSomething { get; set; }
    [AtLeast(1, new Tuple<string, object>("Active", true), new Tuple<string, object>("Name", "John"))]
    public List<Item> AnotherList { get; set; }
}
public class Item
{
    public string Name { get; set; }
    public bool Active { get; set; }
}
public class AtLeastAttribute : ValidationAttribute
{
    public int MinLength { get; set; }
    public Tuple<string, object>[] PropertiesAndValues { get; set; }

    public AtLeastAttribute(int minLength,params Tuple<string, object>[] propsNValues)
    {
        MinLength = minLength;
        PropertiesAndValues = propsNValues;
    }
}

我试图传递一个Tuple<string, object>来表示Property和所需的值。但我得到了这个错误:

属性参数必须是常量表达式、typeof表达式或属性参数类型的数组创建表达式

有人有办法做到这一点吗?

自定义";至少“;属性

同意DavidG的评论;唯一的方法是提供某种常量create表达式,基本上只限于基元类型。如果您想实现这一点,那么您指定的所有约束值都应该可以从字符串转换。

然后你可以想出一些语法,比如

Name=John;Active=True

但并没有那么简单,您可能希望在字符串值中包含;=,因此您需要弄清楚一些字符串语法和转义符:

Name='John'''s Pizza'

Name='John''s Pizza'

然后您需要解析这些信息;正则表达式可能能够做到这一点。

如果可以不使用包含用于拆分的字符的字符串值,只需在;上拆分字符串,然后在=上拆分,然后再进行presto。