Adnotarea datelor C #, nu se poate extinde un atribut specific - care sunt posibilitățile?

voturi
39

Lucrez la o construire de aplicații vechi cu ASP.NET Dynamic Data. Modelele, ca de obicei, sunt numai de citire și se poate seta numele sau descrierea afișatului prin atribute.

Totuși, acest lucru a funcționat bine, acum sunt într-o situație în care trebuie să interogez două surse diferite (fișierul resursă și alte surse) pentru numele afișat.

Codul înainte era curat, deoarece am întrebat doar resursele:

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

Acest lucru a fost în regulă și a funcționat așa cum intenționam. Totuși, acum trebuie să obțin numele afișajului și descrierea în primul rând de la un alt fișier și dacă orice altceva nu reușește, trebuie să revin la resurse.

A trebuit să creez două atribute personalizate diferite, ceva în acest mod:

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

                  }
              }
          }
    }

Acest tip de funcționează și cred că este OK deocamdată, dar problema următoare este la colț: va trebui să fac cu Display.GroupName la fel.

Acum, din câte știu eu, nu există un GroupNameAttribute care să se extindă, așa că sunt cam întuneric aici.

Mi-aș dori să pot extinde DisplayAttribute, ar fi exact ceea ce am nevoie, dar clasa este sigilată, așa că acesta este un punct mort.

Mi-aș dori să pot schimba modelul din mers și să furnizez DisplayName și Descriere prin intermediul setter-urilor, dar modelul are doar getters, așa că acesta este un alt punct mort.

Rulez încet din opțiuni aici. Ce se mai poate face aici?

Întrebat 28/04/2020 la 13:24
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
0

Deși DisplayAttribute este marcat ca seald, este posibil să îl extindeți cu ajutorul unei metode de extensie, ceva de genul:

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

Acest lucru poate rezolva problema dvs., deoarece această metodă de extensie poate fi apelată prin toate instanțele DisplayAttribute.

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

Publicat 21/05/2020 la 20:51
sursa de către utilizator

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