【问题标题】: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:

    如果以下所有陈述都为真,则表达式 Eattribute-argument-expression

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2016-06-14
      • 2020-08-18
      相关资源
      最近更新 更多