Имя DisplayAttribute с переменной 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; }
}

Я говорю о DisplayName с переменной в нем, не статичной и, возможно, основанной на моделях других свойств. Возможно ли это каким-либо образом?

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам