属性接受模型表达式的属性

时间:2013-03-04 16:11:30

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

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

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

    public string Foo2 { get; set; }
}

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

我想实现:

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

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

感谢。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

没有。这是不可能的。根据{{​​3}}:

  

属性参数限制为常量值   以下类型:

     
      
  • 简单类型(bool,byte,char,short,int,long,float和double)
  •   
  • string
  •   
  • System.Type
  •   
  • enums
  •   
  • object(对象类型的属性参数的参数必须是上述类型之一的常量值。)
  •   
  • 任何上述类型的一维阵列
  •   

但你可以这样做:

[MyAttribute(BindMethod = "GetBinding")]
public string Foo1 { get; set; }

public Expression GetBinding()
{
    Expression<Func<MyModel, string>> expr = m => m.Foo2;
    return expr;
}