2012-02-24 122 views
5

想知道这是否可能或具有此效果。带有变量的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中有一个变量,非静态的,可能基于模型的其他属性。这有可能以任何方式?

回答

3

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

表达式E属性参数表达式如果以下所有的语句为真:

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

为目的,如国际化,你可以关键属性像DisplayNameAttribute,DescriptionAttribute和的CategoryAttribute,并使用一些查询(RESX,数据库,等等)。这工作正常,很容易找到示例。

但是,您不能对象的访问值,只是因为:没有给出该属性的上下文!但是,如果这是为像PropertyGrid,DataGridView等东西,还有另一种方法:使用ICustomTypeDescriptor或TypeDescriptionProvider提供自定义描述符,它可以指定它想要的显示名称。您可以在创建自定义描述符的实例时捕获目标对象/属性。如果你只想调整属性,有时TypeConverter比ICustomTypeDescriptor/TypeDescriptionProvider更容易实现,但最终都需要定制PropertyDescriptor实现。

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

+0

请问您可以用一些代码来阐述这个想法吗? – 2017-04-28 19:03:28