A anotação de dados C#, não pode estender um atributo específico - quais são as possibilidades?

votos
39

Estou trabalhando em uma aplicação legada construída com o ASP.NET Dynamic Data. Os modelos, como de costume, são todos somente leitura e pode-se definir o nome de exibição ou descrição através de atributos.

Isto funcionou bem, no entanto, agora estou numa situação em que preciso de consultar duas fontes diferentes (ficheiro de recurso e alguma outra fonte) para obter o nome de exibição.

O código antes estava limpo, porque só consultamos os recursos:

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

Isto estava totalmente bem e funcionou como pretendido. No entanto, agora tenho de obter o nome e descrição do display primeiro de algum outro ficheiro e se tudo o resto falhar, tenho de voltar aos recursos

Eu tive que criar dois atributos personalizados diferentes, algo desta maneira:

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

                  }
              }
          }
    }

Este tipo de funcionamento e acho que por enquanto está tudo bem, mas a próxima edição está ao virar da esquina: Vou precisar de fazer com Display.GroupName o mesmo.

Agora, tanto quanto sei, não há nenhum GroupNameAttributo para estender, por isso estou meio às escuras aqui.

Eu gostaria de poder estender o DisplayAttribute, seria EXATAMENTE o que eu preciso, mas a classe é selada, então isso é um beco sem saída.

Eu gostaria de poder mudar o modelo na mosca e fornecer DisplayName e Descrição através de setters, mas o modelo só tem getters, então esse é outro beco sem saída.

Estou a ficar sem opções aqui. O que mais pode ser feito aqui?

Publicado 28/04/2020 em 13:24
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Embora o DisplayAttribute esteja marcado como seald, você ainda pode estendê-lo usando um método de extensão, algo como o seguinte:

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

Isso pode potencialmente resolver seu problema, já que esse método de extensão pode ser chamado através de todas as instâncias do DisplayAttribute.

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

Respondeu 21/05/2020 em 20:51
fonte usuário

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