Как сделать настраиваемый атрибут DisplayFormat

Я получил формат даты как:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime? CreatedOn { get; set; }

Теперь я хочу, чтобы каждый формат даты и времени в моем приложении читался из одного файла конфигурации. лайк:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = SomeClass.GetDateFormat())]
public DateTime? CreatedOn { get; set; }

но это не скомпилируется.

Как я могу это сделать?

2 ответа

Решение

Проблема в том, что.NET позволяет вам только помещать константы времени компиляции в атрибуты. Другой вариант - наследовать от DisplayFormatAttribute и ищите формат отображения в конструкторе, вот так:

SomeClass.cs

public class SomeClass
{
    public static string GetDateFormat()
    {
        // return date format here
    }
}

DynamicDisplayFormatAttribute.cs

public class DynamicDisplayFormatAttribute : DisplayFormatAttribute
{
    public DynamicDisplayFormatAttribute()
    {
        DataFormatString = SomeClass.GetDateFormat();
    }
}

Тогда вы можете использовать это так:

[DynamicDisplayFormat(ApplyFormatInEditMode = true)]
public DateTime? CreatedOn { get; set; }

Я создал строковую константу в базовом классе и разделил ее на подклассы, чтобы я мог использовать ее.

Например:

public class BaseViewModel : IViewModel
{
    internal const string DateFormat = "dd MMM yyyy";
}

public class MyViewModel : BaseViewModel
{
    [DisplayFormat(ApplyFormatInEditMode = true,
                   DataFormatString = "{0:" + DateFormat + "}")]
    public DateTime? CreatedOn { get; set; }
}

Таким образом, я мог бы также сослаться на это с помощью подклассов:

public class AnotherViewModel
{
    [DisplayFormat(ApplyFormatInEditMode = true,
                   DataFormatString = "{0:" + BaseViewModel.DateFormat + "}")]
    public DateTime? CreatedOn { get; set; }
}
Другие вопросы по тегам