2015-12-22 2 views
3

Я бы хотел использовать атрибут StringLength для Entity, но вместо использования литерала или константы использовать статическое свойство.StringLengh Data Annotation с использованием статического свойства

например

[StringLength(MyClass.MyStaticProperty)] 
public string Code { get; set; } 

Однако это приводит к следующей ошибке ...

Аргумент атрибут должен быть константным выражением, TypeOf выражения или создания массива выражения типа параметра атрибута

... имеет ли кто-нибудь работу или альтернативу, кроме использования строкового литерала или c onstant?

В случае, если вам интересно, почему статическое свойство? Статическое свойство вернет значение из введенного одноэлементного кода. Значение будет введено при запуске приложения.

Спасибо ... и Рождество ...

ответ

1

StringLength параметр атрибута должны быть известно во время компиляции .

Вы можете либо указать точное значение или обратитесь к постоянному значению:

public static class MyClass 
{ 
    public const int MyStaticProperty = 5; 
} 

[StringLength(MyClass.MyStaticProperty)] 
public string Code { get; set; } 

Обратите внимание, что нет static ключевого слова, так как const подразумевает static.

+0

Я не думаю, что с помощью 'const' решает проблему; * Статическое свойство вернет значение из введенного одноэлементного кода. Значение будет введено при запуске приложения. * –

+0

@DionV. Невозможно использовать динамические значения в конструкторе атрибутов. Если это то, чего фактически хочет ОП, то он должен использовать ваш подход :) –

+0

@YeldarKurmangaliyev не кажется естественным ограничением, что инфраструктура сущности должна знать длину поля во время компиляции. – Mick

3

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

public class CustomStringLength: ValidationAttribute 
{ 
    public CustomStringLength() 
    { 
    } 

    public override bool IsValid(object value) 
    { 
     return (string)value.Length == MyClass.MyStaticProperty; 
    } 
} 

Учитывая MyClass.MyStaticProperty является int.

Использование:

[CustomStringLength] 
public string Code { get; set; } 
+0

Я не думаю, что это работает, атрибут будет известен только в первый раз, когда будет создан экземпляр класса, я собираюсь проверить его, это интересный подход :) –

+0

@AlexanderDerck Если это не работает, поделитесь кусок кода и дайте мне знать. Мы можем работать вместе :) –

+0

Будет ли платформа Entity Framework использовать эту проверку? Или это помогает только с использованием сущности в формах MVC? – Mick

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