【问题标题】:DisplayAttribute name with a variable, Dynamic DisplayName带有变量的 DisplayAttribute 名称,Dynamic DisplayName
【发布时间】:2012-03-15 03:34:50
【问题描述】:
想知道这是否可能或有这种效果。
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,它是非静态的,并且可能基于模型的其他属性。这有可能吗?
【问题讨论】:
标签:
c#
data-annotations
string-formatting
displayattribute
【解决方案1】:
出于国际化等目的,您可以子类化 DisplayNameAttribute、DescriptionAttribute 和 CategoryAttribute 等关键属性,并使用一些查找(resx、数据库等)。这很好用,而且很容易找到示例。
但是,您不能访问对象的值,原因很简单:没有给定上下文的属性!
但是,如果这是针对 PropertyGrid、DataGridView 等内容,还有另一种方法:使用 ICustomTypeDescriptor 或 TypeDescriptionProvider 提供自定义描述符,它可以指定所需的 DisplayName。您可以在创建自定义描述符的实例时捕获目标对象/属性。如果您只想调整属性,有时 TypeConverter 可能比 ICustomTypeDescriptor/TypeDescriptionProvider 更容易实现,但最终都需要自定义 PropertyDescriptor 实现。
这是一项相当多的工作;确保您对这种复杂程度感到满意!可能有一个更简单的选择。
【解决方案2】:
这是不可能的,因为为属性参数指定的参数必须是常量值(本能地,因为没有与其他任何内容相关的上下文,并且不一定能够在编译时解析(这是一个要求) )。来自 C# 规范 (3.0) §17.2:
如果以下所有陈述都为真,则表达式 E 是 attribute-argument-expression:
-
E 的类型是属性参数类型 (§17.1.3)。
- 在编译时,
E 的值可以解析为以下之一:
- 一个常数值。
- 一个 System.Type 对象。
-
attribute-argument-expressions 的一维数组。