Имя 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.
Это все совсем немного работы; убедитесь, что вы довольны этим уровнем сложности! Вероятно, есть более простой вариант.