7

想知道这是否可能或具有这种效果的东西。

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,它是非静态的,并且可能基于模型的其他属性。这有可能吗?

4

2 回答 2

3

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

但是,您不能访问对象的值,原因很简单:一个属性没有被赋予该上下文!

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

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

于 2012-02-24T18:06:13.753 回答
3

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

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

  • 的类型E是属性参数类型(第 17.1.3 节)。
  • 在编译时, 的值E可以解析为以下之一:
    • 一个常数值。
    • 一个 System.Type 对象。
    • 属性参数表达式的一维数组。
于 2012-02-24T17:05:37.123 回答