C#-Daten-Annotation, kann ein bestimmtes Attribut nicht erweitern - was sind die Möglichkeiten?

stimmen
1

Ich arbeite an einem Legacy-Anwendungs-Build mit ASP.NET Dynamic Data. Die Modelle sind, wie üblich, alle schreibgeschützt, und man kann den Anzeigenamen oder die Beschreibung über Attribute festlegen.

Das hat gut funktioniert, aber jetzt bin ich in einer Situation, in der ich zwei verschiedene Quellen (Ressourcendatei und eine andere Quelle) nach dem Anzeigenamen abfragen muss.

Der Code davor war sauber, weil wir nur die Ressourcen abgefragt haben:

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

Das war völlig in Ordnung, und es funktionierte wie beabsichtigt. Jetzt muss ich jedoch erst einmal den Anzeigenamen und die Beschreibung aus einer anderen Datei holen, und wenn alles andere fehlschlägt, muss ich auf Ressourcen zurückgreifen

Ich musste zwei verschiedene benutzerdefinierte Attribute erstellen, etwas in dieser Art und Weise:

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

                  }
              }
          }
    }

Diese Art funktioniert, und ich denke, es ist im Moment in Ordnung, aber die nächste Ausgabe steht vor der Tür: Ich werde mit Display.GroupName dasselbe machen müssen.

Soweit ich weiß, gibt es kein GroupNameAttribute zu erweitern, also tappe ich hier irgendwie im Dunkeln.

Ich wünschte, ich könnte das DisplayAttribute erweitern, es wäre genau das, was ich brauche, aber die Klasse ist versiegelt, also ist das eine Sackgasse.

Ich wünschte, ich könnte das Modell bei laufendem Betrieb ändern und DisplayName und Description über Setter bereitstellen, aber das Modell hat nur Getter, also ist das eine weitere Sackgasse.

Mir gehen hier langsam die Optionen aus. Was kann man hier noch tun?

Veröffentlicht am 28/04/2020 um 13:24
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Obwohl DisplayAttribute als versiegelt markiert ist, können Sie es dennoch mit einer Erweiterungsmethode wie der folgenden erweitern:

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

Dies kann Ihr Problem möglicherweise lösen, da diese Erweiterungsmethode über alle DisplayAttribute-Instanzen aufgerufen werden kann.

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

Beantwortet am 21/05/2020 um 20:51
quelle vom benutzer

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