C # adat annotáció, nem lehet kiterjeszteni egy adott attribútumot - milyen lehetőségek vannak?

szavazat
39

Dolgozom egy régebbi alkalmazás-összeállításon az ASP.NET Dynamic Data segítségével. A szokásos módon a modellek mind csak olvashatóak, és a megjelenített nevet vagy leírást az attribútumok segítségével állíthatják be.

Ez azonban jól működött, most olyan helyzetben vagyok, hogy két különböző forrást (forrásfájl és más forrás) kell lekérdeznem a megjelenített névhez.

Az előző kód tiszta volt, mert csak az erőforrásokat kérdeztük:

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

Ez teljesen rendben volt, és a kívánt módon működött. Most azonban először valamilyen más fájlból be kell szereznem a megjelenített nevet és a leírást, és ha minden más meghiúsul, vissza kell állnom az erőforrásokhoz.

Két különböző egyedi attribútumot kellett létrehoznom, valamit ily módon:

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

                  }
              }
          }
    }

Ez a fajta működés, és azt hiszem, egyelőre rendben van, de a következő kérdés a sarkon van: ugyanezt kell tennem a Display.GroupName-hez is.

Most, amennyire tudom, nincs kiterjeszthető a GroupNameAttribute, tehát itt vagyok sötétben.

Bárcsak kibővíteném a DisplayAttribute-t, PONTOSAN szüksége lenne rá, de az osztály le van zárva, tehát ez egy zsákutca.

Bárcsak változtathatnám a modellt menet közben, és a SetName-et és a leírást megadhatjuk a setter-ek segítségével, de a modellnek csak getters van, tehát ez egy újabb zsákutca.

Itt lassan elfogy a lehetőségeim. Mit lehet itt még tenni?

A kérdést 28/04/2020 13:24
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
0

Noha a DisplayAttribute lepecsételtként van megjelölve, kibővítési módszerrel kibővítheti, például a következőképpen:

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

Ez potenciálisan megoldhatja a problémát, mivel ezt a kiterjesztési módszert az összes DisplayAttribute példányon keresztül meg lehet hívni.

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

Válaszolt 21/05/2020 20:51
a forrás felhasználó

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