C# anotación de datos, no puede extender un atributo específico - ¿cuáles son las posibilidades?

votos
1

Estoy trabajando en una aplicación heredada construida con ASP.NET Dynamic Data. Los modelos, como de costumbre, son todos de sólo lectura y se puede establecer el nombre de visualización o descripción a través de atributos.

Esto funcionó bien, sin embargo, ahora estoy en una situación en la que necesito consultar dos fuentes diferentes (archivo de recursos y alguna otra fuente) para el nombre a mostrar.

El código anterior estaba limpio, porque sólo consultamos los recursos:

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

Esto estaba totalmente bien y funcionaba como se pretendía. Sin embargo, ahora tengo que obtener el nombre para mostrar y la descripción primero de algún otro archivo y si todo lo demás falla, tengo que recurrir a los recursos

Tuve que crear dos atributos personalizados diferentes, algo de esta manera:

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

                  }
              }
          }
    }

Esto funciona y supongo que está bien por el momento, pero el próximo número está a la vuelta de la esquina: Necesitaré hacer lo mismo con Display.GroupName.

Hasta donde sé, no hay ningún atributo de nombre de grupo para extender, así que estoy un poco a oscuras aquí.

Desearía poder extender el Atributo de Visualización, sería EXACTAMENTE lo que necesito, pero la clase está sellada, así que es un callejón sin salida.

Desearía poder cambiar el modelo sobre la marcha y proporcionar DisplayName y Description a través de setters, pero el modelo sólo tiene getters, así que es otro callejón sin salida.

Me estoy quedando sin opciones lentamente. ¿Qué más se puede hacer aquí?

Publicado el 28/04/2020 a las 13:24
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Aunque el DisplayAttribute está marcado como seald, todavía puede extenderlo usando un método de extensión, algo como lo siguiente:

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

Esto puede potencialmente resolver tu problema ya que este método de extensión puede ser llamado a través de todas las instancias de DisplayAttribute.

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

Respondida el 21/05/2020 a las 20:51
fuente por usuario

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