【问题标题】:StringLengh Data Annotation using a static property使用静态属性的 StringLengh 数据注释
【发布时间】:2016-03-28 10:17:07
【问题描述】:

我想在实体上使用 StringLength 属性,但不是使用文字或常量,而是使用静态属性。

例如

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

但是这会导致以下错误...

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

...除了使用字符串文字或常量之外,有没有人有解决方法或替代方法?

如果您想知道为什么是静态属性?静态属性将从注入的单例返回一个值。该值将在应用程序启动时注入。

谢谢...圣诞快乐...

【问题讨论】:

    标签: c# .net entity-framework


    【解决方案1】:

    创建自己的属性可能是最好的解决方案。然后,您还可以控制以后可能要实现的任何其他逻辑。

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

    【讨论】:

    • 我认为这行不通,只有在第一次创建类的实例时才能知道该属性,我要对其进行测试,这是一种有趣的方法:)
    • @AlexanderDerck 如果它不起作用,请分享一段代码并让我知道。我们可以一起解决:)
    • 实体框架会使用这个验证吗?还是这只有助于在 MVC 表单中使用实体?
    【解决方案2】:

    StringLength 属性参数应该在编译时知道。

    您可以指定确切的值或引用一个常量值:

    public static class MyClass
    {
        public const int MyStaticProperty = 5;
    }
    
    [StringLength(MyClass.MyStaticProperty)]
    public string Code { get; set; }
    

    注意没有static 关键字,因为const 暗含static。

    【讨论】:

    • 我不认为使用const 可以解决问题; 静态属性将从注入的单例返回一个值。该值将在应用程序启动时注入。
    • @DionV。不能在属性构造函数中使用动态值。如果这就是 OP 真正想要的,那么他应该使用你的方法:)
    • @YeldarKurmangaliyev 似乎并不是实体框架在编译时需要知道字段长度的自然约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多