C# annotazione dei dati, non può estendere un attributo specifico - quali sono le possibilità?

voti
39

Sto lavorando su un'applicazione legacy costruita con ASP.NET Dynamic Data. I modelli, come al solito, sono tutti di sola lettura e si può impostare il nome di visualizzazione o la descrizione attraverso gli attributi.

Questo ha funzionato bene, tuttavia, ora mi trovo in una situazione in cui ho bisogno di interrogare due diverse fonti (file di risorse e qualche altra fonte) per il nome di visualizzazione.

Il codice prima era pulito, perché abbiamo interrogato solo le risorse:

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

E' andata benissimo e ha funzionato come previsto. Tuttavia, ora devo ottenere il nome di visualizzazione e la descrizione in primo luogo da qualche altro file e se tutto il resto fallisce, devo fare un ripiego sulle risorse

Ho dovuto creare due diversi attributi personalizzati, qualcosa in questo modo:

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

                  }
              }
          }
    }

Questo genere di cose funziona e credo che per il momento vada bene, ma il prossimo numero è dietro l'angolo: Dovrò fare lo stesso con Display.GroupName.

Ora, per quanto ne so, non c'è GroupNameAttribute da estendere, quindi sono un po' al buio qui.

Vorrei poter estendere il DisplayAttributo, sarebbe ESATTAMENTE ciò di cui ho bisogno, ma la classe è sigillata, quindi questo è un vicolo cieco.

Vorrei poter cambiare il modello al volo e fornire DisplayName e Description attraverso i setter, ma il modello ha solo i getter, quindi questo è un altro vicolo cieco.

Sto esaurendo lentamente le opzioni. Cos'altro si può fare qui?

È pubblicato 28/04/2020 alle 13:24
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

Anche se DisplayAttribute è contrassegnato come seald, si può comunque estenderlo usando un metodo di estensione, qualcosa come il seguente:

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

Questo può potenzialmente risolvere il problema in quanto questo metodo di estensione può essere chiamato attraverso tutte le istanze di DisplayAttribute.

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

Risposto il 21/05/2020 a 20:51
fonte dall'utente

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