【问题标题】:Attribute Properties that accept model expressions [duplicate]接受模型表达式的属性属性[重复]
【发布时间】:2013-03-04 16:11:29
【问题描述】:

我有一个带有属性的模型,这些属性以字符串形式相互引用。例如。

public MyModel
{
    [MyAttribute(BindTo = "Foo2")]
    public string Foo1 { get; set; }

    public string Foo2 { get; set; }
}

这些字段名称后来在 javascript 中用于通过名称选择器在 DOM 上相互挑选,但是有没有办法使用表达式来防止属性名称更改破坏选择器?在更复杂的模型中,它可能会被遗忘。

我想实现:

[MyAttribute(BindTo = m => m.Foo2)]

这可能吗?我怎样才能实现它?到目前为止,我很茫然。

谢谢。

【问题讨论】:

  • 考虑在这种情况下不使用属性

标签: c# asp.net-mvc model-view-controller lambda


【解决方案1】:

很遗憾,这是不可能的。 C# 属性可以接受一组非常有限的值。基本上任何可以合法放入 C# const 值的东西加上数组的一些扩展。不允许将表达式树 lambda 作为属性参数

【讨论】:

    【解决方案2】:

    没有。这不可能。根据documentation

    属性参数仅限于 以下类型:

    • 简单类型(bool、byte、char、short、int、long、float 和 double)
    • 字符串
    • System.Type
    • 枚举
    • object(object类型的属性参数的参数必须是上述类型之一的常量值。)
    • 上述任何类型的一维数组

    但是你可以这样做:

    [MyAttribute(BindMethod = "GetBinding")]
    public string Foo1 { get; set; }
    
    public Expression GetBinding()
    {
        Expression<Func<MyModel, string>> expr = m => m.Foo2;
        return expr;
    }
    

    【讨论】:

    • 好的,谢谢。自提供文档报价以来已被接受为答案,尽管我不会使用您的替代解决方案,因为它只会产生它试图解决的问题。
    • @Tim 是的,我承认这确实不是解决您问题的好方法。只有当属性指向的函数中有一些复杂的逻辑(类似于CustomValidationAttribute 类)时,我才会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    相关资源
    最近更新 更多