2014-09-10 2 views
0

Я пытаюсь создать атрибут для проверки моей модели.Пользовательский атрибут «По крайней мере»

В моей модели у меня есть список. Этот список должен иметь определенное количество элементов, которое соответствует критериям, например «по крайней мере 1 активный элемент» или «по крайней мере 1 активный элемент с именем« Джон »в качестве его имени».

Мой код-то вроде этого:

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> сказать собственности и требуемое значение. Но я получаю эту ошибку:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

У кого-нибудь есть способ сделать это?

+2

Возможно, вместо кортежей, передать пара параметров или конкатенированную строку типа '" Active, True "," Name, John "'? – DavidG

+1

Вы можете сохранить свои Tuples в статическом словаре и дать ключ атрибуту AtLeast. '[AtLeast (1,« IsActiveTrue »)], но предложение DavidG работает для элементов данных, которые легко конвертируются в строку и из нее, что, вероятно, будет большей частью того, для чего вы будете использовать это. – Grax

ответ

0

Согласен с комментарием DavidG; единственный способ сделать это - предоставить какие-то выражения с постоянным созданием, которые в основном ограничивают примитивные типы. Если вы хотите реализовать это, то все указанные вами значения ограничений должны быть конвертируемыми из строки.

Тогда вы можете думать о какой-то синтаксис как

Name=John;Active=True 

Но это не так просто, вы можете включить ; или = в строке значений, так что вы должны выяснить некоторые строки синтаксиса и избежать символов :

Name='John\\'s Pizza' 

Или

Name='John''s Pizza' 

Затем вам нужно проанализировать эту информацию; регулярное выражение могло бы это сделать.

Если вы можете обойтись без строковых значений, содержащих символы, которые вы используете для разделения, просто разделите строку на ;, затем = и presto.

Смежные вопросы