Annotation des données en C#, ne peut pas étendre un attribut spécifique - quelles sont les possibilités ?

voix
39

Je travaille sur la création d'une application patrimoniale avec ASP.NET Dynamic Data. Les modèles, comme d'habitude, sont tous en lecture seule et on peut définir le nom d'affichage ou la description par le biais d'attributs.

Cela fonctionnait bien, mais maintenant je suis dans une situation où je dois interroger deux sources différentes (fichier de ressources et une autre source) pour le nom d'affichage.

Le code précédent était propre, car nous ne faisions qu'interroger les ressources :

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

C'était très bien et cela a fonctionné comme prévu. Cependant, je dois maintenant obtenir le nom d'affichage et la description d'abord à partir d'un autre fichier et si tout le reste échoue, je dois me rabattre sur les ressources

J'ai dû créer deux attributs personnalisés différents, quelque chose de cette manière :

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

                  }
              }
          }
    }

Ce genre de travail fonctionne et je suppose que c'est bon pour l'instant, mais le prochain numéro est pour bientôt : Je vais devoir faire la même chose avec Display.GroupName.

Maintenant, pour autant que je sache, il n'y a pas de GroupNameAttribute à étendre, donc je suis un peu dans le noir là.

J'aimerais pouvoir étendre l'attribut DisplayAttribute, ce serait EXACTEMENT ce dont j'ai besoin, mais la classe est scellée, donc c'est une impasse.

J'aimerais pouvoir changer le modèle à la volée et fournir DisplayName et Description par le biais de setters, mais le modèle n'a que des getters, donc c'est une autre impasse.

Je suis à court d'options ici. Que peut-on faire d'autre ici ?

Créé 28/04/2020 à 13:24
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Bien que DisplayAttribute soit marqué comme seald, vous pouvez toujours l'étendre en utilisant une méthode d'extension, comme la suivante :

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

Cela peut potentiellement résoudre votre problème car cette méthode d'extension peut être appelée par toutes les instances de DisplayAttribute.

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

Créé 21/05/2020 à 20:51
source utilisateur

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