1

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

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

    public string Foo2 { get; set; }
}

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

我想实现:

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

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

谢谢。

4

2 回答 2

2

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

于 2013-03-04T16:13:40.090 回答
1

不,这是不可能的。根据文档

属性参数仅限于以下类型的常量值:

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

但是你可以这样做:

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

public Expression GetBinding()
{
    Expression<Func<MyModel, string>> expr = m => m.Foo2;
    return expr;
}
于 2013-03-04T16:15:53.647 回答