想知道这是否可行或具有此效果的事情。
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,非静态的,可能还基于其他属性的模型。这有可能吗?
答案 0 :(得分:3)
这是不可能的,因为为属性参数指定的参数必须是常量值(本能地,因为没有与其他任何内容相关的上下文,并且不一定能够在编译时解析(这是一个要求) )。来自C#规范(3.0)§17.2:
如果以下所有语句都为真,则表达式E
是 attribute-argument-expression :
E
的类型是属性参数类型(第17.1.3节)。E
的值可以解析为以下之一:
答案 1 :(得分:3)
出于国际化的目的,您可以子类化关键属性,如DisplayNameAttribute,DescriptionAttribute和CategoryAttribute,并使用一些查找(resx,数据库,等等)。这很好用,很容易找到例子。
但是,你无法访问对象的值,只是因为:没有给出该属性的上下文!
但是,如果这是针对像PropertyGrid,DataGridView等,还有另一种方法:使用ICustomTypeDescriptor或TypeDescriptionProvider提供自定义描述符,可以指定它想要的DisplayName。您可以在创建自定义描述符的实例时捕获目标对象/属性。如果您只想调整属性,有时TypeConverter可以比ICustomTypeDescriptor / TypeDescriptionProvider更容易实现,但最终都需要自定义PropertyDescriptor实现。
这都是相当多的工作;确保你对这种复杂程度感到满意!可能有一个更简单的选择。