C# anotacja danych, nie można rozszerzyć konkretnego atrybutu - jakie są możliwości?

głosy
1

Pracuję nad starą aplikacją zbudowaną z ASP.NET Dynamic Data. Wszystkie modele, jak zwykle, są tylko do odczytu i można ustawić nazwę wyświetlania lub opis poprzez atrybuty.

Zadziałało to jednak dobrze, teraz jestem w sytuacji, w której muszę zapytać o nazwę wyświetlania z dwóch różnych źródeł (pliku źródłowego i jakiegoś innego źródła).

Poprzedni kod był czysty, bo tylko zapytaliśmy o zasoby:

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

To było całkowicie w porządku i działało zgodnie z przeznaczeniem. Jednak teraz muszę najpierw uzyskać nazwę i opis wyświetlacza z jakiegoś innego pliku, a jeśli wszystko inne zawiedzie, muszę cofnąć się do zasobów

Musiałem stworzyć dwa różne niestandardowe atrybuty, coś w tym stylu:

    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;
                      }

                  }
              }
          }
    }

Na razie to chyba w porządku, ale następny numer jest już za rogiem: Będę musiał zrobić z Display.GroupName to samo.

Z tego co wiem, nie ma żadnego GroupNameAttribute do rozszerzenia, więc jestem tu po omacku.

Chciałbym móc rozszerzyć DisplayAttribute, to byłoby WYRAŹNIE to, czego potrzebuję, ale klasa jest zamknięta, więc to ślepy zaułek.

Chciałbym zmienić model w locie i dostarczyć DisplayName i opis poprzez settery, ale model ma tylko gettery, więc to kolejny ślepy zaułek.

Powoli kończą mi się tu opcje. Co jeszcze można tu zrobić?

Utwórz 28/04/2020 o 13:24
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Mimo, że DisplayAttribute jest oznaczony jako seald, to jednak można go rozszerzyć za pomocą metody rozszerzeń, czyli czegoś w rodzaju poniższego:

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

Może to potencjalnie rozwiązać Państwa problem, ponieważ ta metoda rozszerzenia może być wywołana przez wszystkie instancje DisplayAttribute.

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

Odpowiedział 21/05/2020 o 20:51
źródło użytkownik

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