C# 海关;至少;属性

C# 海关;至少;属性,c#,asp.net-mvc,C#,Asp.net Mvc,我正在尝试创建一个属性来验证我的模型 在我的模型中,我有一个列表。该列表必须具有与条件匹配的确定数量的项,例如“至少1个活动项”或“至少1个活动项,名称为“John” 我的代码是这样的: public class Foo { [AtLeast(1, new Tuple<string, object>("Active", true))] public List<Item> ListOfSomething { get; set; } [AtLeast

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

在我的模型中,我有一个列表。该列表必须具有与条件匹配的确定数量的项,例如“至少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;
    }
}
公共类Foo
{
[至少(1,新元组(“活动”,真))]
某些内容的公共列表{get;set;}
[至少(1,新元组(“活动”,true),新元组(“名称”,“约翰”))]
公共列表另一个列表{get;set;}
}
公共类项目
{
公共字符串名称{get;set;}
公共bool活动{get;set;}
}
公共类AtLeastAttribute:ValidationAttribute
{
public int MinLength{get;set;}
公共元组[]属性和值{get;set;}
公共AtLeastAttribute(int minLength,参数元组[]propsNValues)
{
MinLength=MinLength;
PropertiesAndValues=propsNValues;
}
}
我试图传递一个
元组来表示属性和所需的值。但我得到了一个错误:

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


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

同意大卫格的评论;唯一的方法是提供某种常量create表达式,基本上只限于基本类型。如果要实现此功能,则指定的所有约束值都应该可以从字符串转换

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

Name=John;Active=True
但这并不是那么简单,您可能希望包括
=
,因此需要找出一些字符串语法和转义字符:

Name='John\\'s Pizza'

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


如果不需要包含用于拆分的字符的字符串值,只需在
上拆分字符串即可
然后
=
和presto.

可能不是元组,而是成对传递参数,或者像
“Active,True”,“Name,John”
这样的串联字符串。您可以将元组存储在静态字典中,并将密钥赋予至少一个属性<代码>[至少(1,“IsActiveTrue”)]
,但DavidG的建议适用于易于转换为字符串或从字符串转换为字符串的数据项,这可能是您使用此选项的主要目的。
Name='John''s Pizza'