C # anotace dat, nemůže rozšířit konkrétní atribut - jaké jsou možnosti?

hlasů
1

Pracuji na vytváření starší aplikace s ASP.NET Dynamic Data. Modely, jak je obvyklé, jsou pouze pro čtení a je možné nastavit zobrazovaný název nebo popis pomocí atributů.

To fungovalo dobře, ale nyní jsem v situaci, kdy musím dotazovat dva různé zdroje (zdrojový soubor a nějaký jiný zdroj) na zobrazovaný název.

Kód předtím byl čistý, protože jsme se dotazovali pouze na zdroje:

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

To bylo naprosto v pořádku a fungovalo to tak, jak bylo zamýšleno. Nyní však musím nejprve získat zobrazovaný název a popis z nějakého jiného souboru a pokud všechno ostatní selže, musím se vrátit ke zdrojům.

Musel jsem vytvořit dva různé vlastní atributy, něco takto:

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

                  }
              }
          }
    }

Tento druh prací a myslím, že je to zatím v pořádku, ale další problém je za rohem: Budu muset udělat totéž s Display.GroupName.

Nyní, pokud vím, neexistuje žádný atribut GroupNameAttribute, který by se dal rozšířit, takže jsem tady trochu ve tmě.

Přál bych si, abych mohl rozšířit atribut DisplayAt, bylo by to přesně to, co potřebuji, ale třída je zapečetěna, takže to je slepá ulička.

Přál bych si, abych mohl model změnit za běhu a poskytnout zobrazovací jméno a popis pomocí setterů, ale model má pouze getters, takže to je další slepá ulička.

Tady pomalu vybíhám z možností. Co jiného se tady dá udělat?

Položena 28/04/2020 v 13:24
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
0

Ačkoli je DisplayAttribute označen jako seald, můžete jej stále rozšířit pomocí metody rozšíření, například takto:

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

To může potenciálně vyřešit váš problém, protože tuto metodu rozšíření lze volat prostřednictvím všech instancí DisplayAttribute.

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

Odpovězeno 21/05/2020 v 20:51
zdroj uživatelem

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