带有变量Dynamic DisplayName的DisplayAttribute名称

时间:2012-02-24 17:04:17

标签: c# data-annotations string-formatting displayattribute

想知道这是否可行或具有此效果的事情。

public class MyModel
{
    public string Name { get; set; }

    [Display(Name = String.Format("This is [0]'s phone number", Name)]
    public string PhoneNumber { get; set; }
}

我在谈论一个带有变量的DisplayName,非静态的,可能还基于其他属性的模型。这有可能吗?

2 个答案:

答案 0 :(得分:3)

这是不可能的,因为为属性参数指定的参数必须是常量值(本能地,因为没有与其他任何内容相关的上下文,并且不一定能够在编译时解析(这是一个要求) )。来自C#规范(3.0)§17.2:

如果以下所有语句都为真,则表达式E attribute-argument-expression

  • E的类型是属性参数类型(第17.1.3节)。
  • 在编译时,E的值可以解析为以下之一:
    • 一个恒定值。
    • System.Type对象。
    • attribute-argument-expressions 的一维数组。

答案 1 :(得分:3)

出于国际化的目的,您可以子类化关键属性,如DisplayNameAttribute,DescriptionAttribute和CategoryAttribute,并使用一些查找(resx,数据库,等等)。这很好用,很容易找到例子。

但是,你无法访问对象的值,只是因为:没有给出该属性的上下文!

但是,如果这是针对像PropertyGrid,DataGridView等,还有另一种方法:使用ICustomTypeDescriptor或TypeDescriptionProvider提供自定义描述符,可以指定它想要的DisplayName。您可以在创建自定义描述符的实例时捕获目标对象/属性。如果您只想调整属性,有时TypeConverter可以比ICustomTypeDescriptor / TypeDescriptionProvider更容易实现,但最终都需要自定义PropertyDescriptor实现。

这都是相当多的工作;确保你对这种复杂程度感到满意!可能有一个更简单的选择。