C# data annotatie, kan een specifiek attribuut niet uitbreiden - wat zijn de mogelijkheden?

stemmen
39

Ik werk aan een legacy-applicatie die is gebouwd met ASP.NET Dynamic Data. De modellen zijn, zoals gebruikelijk, allemaal alleen-lezen en men kan de displaynaam of beschrijving instellen via attributen.

Dit werkte goed, maar nu zit ik in een situatie waarin ik twee verschillende bronnen (bronbestand en een andere bron) moet bevragen voor de weergave van de naam.

De code daarvoor was schoon, want we hebben alleen de bronnen opgevraagd:

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

Dit was helemaal in orde en het werkte zoals bedoeld. Nu moet ik echter eerst de displaynaam en beschrijving uit een ander bestand halen en als al het andere faalt, moet ik terugvallen op resources

Ik moest twee verschillende aangepaste attributen maken, iets op deze manier:

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

                  }
              }
          }
    }

Dit werkt wel en ik denk dat het voorlopig wel goed is, maar het volgende probleem ligt om de hoek: Ik moet het doen met Display.GroupName hetzelfde.

Nu, voor zover ik weet, is er geen GroupNameAttribute om uit te breiden, dus ik ben soort van in het donker hier.

Ik wou dat ik de DisplayAttribute kon uitbreiden, het zou EXACTLY zijn wat ik nodig heb, maar de klas is verzegeld, dus dat is een doodlopende weg.

Ik wou dat ik het model on the fly kon veranderen en DisplayName en Description kon leveren via setters, maar het model heeft alleen maar getters, dus dat is weer een doodlopende weg.

Ik heb hier langzaam geen opties meer. Wat kan er nog meer gedaan worden?

De vraag is gesteld op 28/04/2020 om 13:24
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

Hoewel DisplayAttribute is gemarkeerd als seald, kunt u het nog steeds uitbreiden met behulp van een uitbreidingsmethode, zoiets als het volgende:

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

Dit kan uw probleem oplossen omdat deze uitbreidingsmethode door alle DisplayAttribute instanties kan worden aangeroepen.

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

antwoordde op 21/05/2020 om 20:51
bron van user

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