2012-02-24 15 views
5

Se pregunta si esto es posible o algo con este efecto.DisplayAttribute name with a variable, Dynamic DisplayName

public class MyModel 
{ 
    public string Name { get; set; } 

    [Display(Name = String.Format("This is [0]'s phone number", Name)] 
    public string PhoneNumber { get; set; } 
} 

Estoy hablando de un DisplayName con una variable en él, no estático y posiblemente basado en los modelos de otras propiedades. ¿Es esto posible de alguna manera?

Respuesta

3

Esto no es posible porque los argumentos especificados para los parámetros de los atributos deben ser valores constantes (instintivamente, porque no hay contexto en relación con nada y no necesariamente pueden resolverse en tiempo de compilación (que es un requisito)). Desde el C# Specification (3.0) § 17.2:

Una expresión E es un atributo-argumento-expresión si todas las siguientes afirmaciones son ciertas:

  • El tipo de E es un tipo de parámetro atributo (§17.1.3).
  • en tiempo de compilación, el valor de E se pueden resolver a uno de los siguientes:
    • un valor constante.
    • Un objeto System.Type.
    • Una matriz unidimensional de atributo-argumento-expresiones.
3

Para fines como la internacionalización, que pueda subclase los atributos clave como DisplayNameAttribute, DescriptionAttribute y CategoryAttribute, y utilizar algunas de consulta (resx, base de datos, lo que sea). Esto funciona bien y es fácil encontrar ejemplos.

Sin embargo, usted no puede acceder a los valores del objeto, simplemente porque: un atributo no se le da ese contexto!

Sin embargo, si esto es para cosas como PropertyGrid, DataGridView, etc., hay otro enfoque: use ICustomTypeDescriptor o TypeDescriptionProvider para proporcionar un descriptor personalizado, que puede especificar el DisplayName que desea. Puede capturar el objeto/propiedad de destino cuando crea la instancia del descriptor personalizado. Si solo quiere ajustar las propiedades, a veces TypeConverter puede ser más fácil de implementar que ICustomTypeDescriptor/TypeDescriptionProvider, pero finalmente ambos necesitan implementaciones personalizadas de PropertyDescriptor.

Esto es todo un trabajo; ¡asegúrese de estar satisfecho con este nivel de complejidad! Probablemente haya una opción más simple.

+0

¿podría elaborar esta idea con algún código, por favor? –