C # data merknad, kan ikke utvide et spesifikt attributt - hva er mulighetene?

stemmer
39

Jeg jobber med en gammel applikasjonsbygg med ASP.NET Dynamic Data. Som vanlig er modellene bare skrivebeskyttet, og man kan angi visningsnavn eller beskrivelse gjennom attributter.

Dette fungerte bra, men nå er jeg i en situasjon der jeg trenger å spørre om to forskjellige kilder (ressursfil og annen kilde) for visningsnavn.

Koden før var ren, fordi vi bare spurte ressursene:

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

Dette var helt greit og det fungerte etter hensikten. Nå må jeg imidlertid hente visningsnavn og beskrivelse først fra en annen fil, og hvis alt annet mislykkes, må jeg falle tilbake til ressursene.

Jeg måtte lage to forskjellige egendefinerte attributter, noe på denne måten:

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

                  }
              }
          }
    }

Denne typen fungerer, og jeg antar at det er OK foreløpig, men neste nummer er rundt hjørnet: Jeg må gjøre med Display.GroupName det samme.

Nå, så vidt jeg vet, er det ingen GroupNameAttribute å utvide, så jeg er litt i mørket her.

Jeg skulle ønske jeg kunne utvide DisplayAttribute, det ville være NØYAKTIG det jeg trenger, men klassen er forseglet, så det er en blindvei.

Jeg skulle ønske jeg kunne endre modellen på fly og gi DisplayName og Description gjennom setters, men modellen har bare getters, så det er en annen blindvei.

Jeg går sakte ut av alternativene her. Hva annet kan gjøres her?

Publisert på 28/04/2020 klokken 13:24
kilden bruker
På andre språk...                            


1 svar

stemmer
0

Selv om DisplayAttribute er merket som seald, kan du fremdeles utvide det ved å bruke en utvidelsesmetode, noe som følgende:

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

Dette kan potensielt løse problemet ditt, siden denne utvidelsesmetoden kan kalles gjennom alle DisplayAttribute-forekomster.

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

Svarte 21/05/2020 kl. 20:51
kilden bruker

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