Аннотация данных на C#, не может расширить конкретный атрибут - каковы возможности?

голоса
39

Я работаю над созданием старого приложения с ASP.NET Dynamic Data. Все модели, как обычно, доступны только для чтения, а отображаемое имя или описание можно задать через атрибуты.

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

Раньше код был чистым, потому что мы опрашивали только ресурсы:

[Display(ResourceType = typeof(Resources.m_Res), Name = M_RES_MIMETYPE_ID, Description = M_RES_MIMETYPE_ID_DESCR)]

Это было совершенно нормально и сработало, как и предполагалось. Однако теперь мне нужно получить отображаемое имя и описание сначала из какого-нибудь другого файла, и если все остальное не удается, я должен вернуться к ресурсам

Мне пришлось создать два разных пользовательских атрибута, что-то в этом роде:

    public class MGADisplayName : DisplayNameAttribute
    {
          private readonly string propertyName;
          public string Name { get; set; }
          public Type TableName { get; set; }
          public Type ResourceType { get; set; }

          public MGADisplayName([CallerMemberName] string PropertyName = null)
          {
              propertyName = PropertyName;
          }

          public override string DisplayName
          {
              get
              {
                  var key = (TableName.Name + : + (propertyName ?? Name)).ToLower();
                  if (/* SOME QUERYING */)
                  {
                      return QUERY[key];
                  }
                  else
                  {
                      string property = Resources.m_Res.ResourceManager.GetString(Name);
                      if (property != null)
                      {
                          return property;
                      }
                      else
                      {
                          return Name;
                      }

                  }
              }
          }
    }

Это вроде как работает, и я думаю, что пока это нормально, но следующий выпуск за углом: Мне нужно сделать с Display.GroupName то же самое.

Теперь, насколько я знаю, нет GroupNameAttribute для расширения, так что я вроде как в темноте.

Хотел бы я продлить DisplayAttribute, это было бы ИСКЛЮЧИТЕЛЬНО то, что мне нужно, но класс запечатан, так что это тупик.

Я бы хотел изменить модель на лету и предоставить DisplayName и Description через сеттеры, но у модели есть только геттеры, так что это еще один тупик.

У меня тут медленно заканчиваются варианты. Что еще здесь можно сделать?

Задан 28/04/2020 в 13:24
источник пользователем
На других языках...                            


1 ответов

голоса
0

Хотя DisplayAttribute помечен как seald, вы все же можете расширить его с помощью метода расширения, что-то вроде следующего:

public static class DisplayAttributeExtensions
{
    public static string GetGroupName(this DisplayAttribute display)
    {
        // TODO: your implementation logic
    }
}

Это потенциально может решить вашу проблему, так как этот метод расширения может быть вызван через все экземпляры DisplayAttribute.

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

Ответил 21/05/2020 в 20:51
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more