Имя DisplayAttribute с переменной Dynamic DisplayName - PullRequest
6 голосов
/ 24 февраля 2012

Хотите знать, если это возможно, или что-то с этим эффектом.

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 с переменной в нем, не статичной и, возможно, основанной на других свойствах моделей. Это возможно каким-либо образом?

Ответы [ 2 ]

3 голосов
/ 24 февраля 2012

Для таких целей, как интернационализация, вы можете подкласс ключевые атрибуты, такие как DisplayNameAttribute, DescriptionAttribute и CategoryAttribute, и использовать некоторый поиск (resx, database, что угодно).Это прекрасно работает, и примеры легко найти.

Однако вы не можете получить доступ к значениям объекта, просто потому что: атрибуту не задан этот контекст!

Однако, если это относится к таким вещам, как PropertyGrid, DataGridView и т. Д., Есть другой подход: используйте либо ICustomTypeDescriptor, либо TypeDescriptionProvider, чтобы предоставить собственный дескриптор, который может указать желаемое DisplayName.Вы можете захватить целевой объект / свойство при создании экземпляра пользовательского дескриптора.Если вы хотите только настроить свойства, иногда TypeConverter может быть проще реализовать, чем ICustomTypeDescriptor / TypeDescriptionProvider, но в конечном итоге оба требуют пользовательских реализаций PropertyDescriptor.

Это все довольно трудоемкий процесс;убедитесь, что вы довольны этим уровнем сложности!Вероятно, есть более простой вариант.

3 голосов
/ 24 февраля 2012

Это невозможно, потому что аргументы, указанные для параметров атрибутов, должны быть постоянными значениями (инстинктивно, потому что нет никакого контекста по отношению к чему-либо еще и не обязательно могут быть разрешены во время компиляции (что является требованием) ). Из спецификации C # (3.0) §17.2:

Выражение E является выражением-атрибута-аргумента , если все следующие утверждения верны:

  • Тип E является типом параметра атрибута (§17.1.3).
  • Во время компиляции значение E может быть разрешено одним из следующих:
    • Постоянное значение.
    • Объект System.Type.
    • Одномерный массив выражений атрибут-аргумент .
...