Compartilhamento de tecnologia

C# 3 maneiras de obter o displayName de um atributo

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Insira a descrição da imagem aqui


Em C#, obter o displayName de uma propriedade pode ser realizado de diversas maneiras, inclusive usando atributos, reflexão e LINQ. Abaixo mostrarei cada método individualmente e fornecerei um exemplo de código específico.

1. Acesso direto usando recursos

Ao definir uma propriedade, você pode usar o atributo DisplayName para especificar o nome de exibição da propriedade. Este método é o mais simples e direto e é adequado para situações em que o nome de exibição precisa ser especificado quando o atributo é projetado.

using System;
using System.ComponentModel;

public class MyModel
{
    [DisplayName("Full Name")]
    public string Name { get; set; }
}

// 使用
MyModel model = new MyModel();
string displayName = model.Name.DisplayName; // 假设DisplayName特性已经被附加到属性上

Observação: no .NET Core, o atributo DisplayName pode ter sido preterido e talvez seja necessário usar DisplayAttribute.

2. Use o método GetCustomAttribute() para obtê-lo por meio de reflexão

Através da reflexão, você pode obter dinamicamente atributos personalizados em atributos, incluindo DisplayAttribute.

using System;
using System.ComponentModel;
using System.Reflection;

public class MyModel
{
    [Display(Name = "Full Name")]
    public string Name { get; set; }
}

// 使用
MyModel model = new MyModel();
string displayName = "";

PropertyInfo propertyInfo = model.GetType().GetProperty("Name");
DisplayAttribute displayAttribute = (DisplayAttribute)propertyInfo.GetCustomAttribute(typeof(DisplayAttribute), false);

if (displayAttribute != null)
{
    displayName = displayAttribute.Name;
}

3. Consulta usando LINQ

Se você tiver uma lista de propriedades e quiser consultar propriedades com um nome de exibição específico, poderá usar o LINQ para simplificar o processo de consulta.

using System;
using System.ComponentModel;
using System.Linq;
using System.Reflection;

public class MyModel
{
    [Display(Name = "Full Name")]
    public string Name { get; set; }

    [Display(Name = "Date of Birth")]
    public DateTime DateOfBirth { get; set; }
}

// 使用
MyModel model = new MyModel();
string displayName = "";

var attributes = from property in model.GetType().GetProperties()
                 let displayAttribute = Attribute.GetCustomAttribute(property, typeof(DisplayAttribute)) as DisplayAttribute
                 where displayAttribute != null
                 select displayAttribute;

foreach (var attribute in attributes)
{
    if (attribute.Name == "Full Name")
    {
        displayName = attribute.Name;
        break;
    }
}

Resumo e comparação

1. Acesso direto usando atributos: A maneira mais simples é apenas adicionar o atributo DisplayName ao atributo. Este método já determina o nome de exibição quando o atributo é definido e não requer consultas adicionais em tempo de execução.

2. Use o método GetCustomAttribute() para obter por meio de reflexão: Obtenha o atributo DisplayAttribute no atributo por meio de reflexão. Este método obtém informações de atributos dinamicamente em tempo de execução e é mais flexível, mas a sobrecarga de desempenho é um pouco maior do que acessar recursos diretamente.

3. Use a consulta LINQ: Consulte uma lista de propriedades via LINQ para encontrar propriedades com um nome de exibição específico. Este método é adequado para filtragem quando há um grande número de atributos, mas pode ser muito complexo e não é a melhor escolha para cenários simples.

Cada método tem seus cenários aplicáveis. No desenvolvimento real, o método mais apropriado deve ser selecionado com base nas necessidades específicas e nas considerações de desempenho. Se houver poucas propriedades e o nome de exibição for conhecido no momento da definição, o uso de atributos será a abordagem mais simples e direta. Se você precisar obter informações de atributos dinamicamente ou se houver muitos atributos, pode ser mais apropriado usar reflexão ou LINQ.