Compartir tecnología

C# 3 formas de obtener el nombre para mostrar de un atributo

2024-07-08

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


Insertar descripción de la imagen aquí


En C#, obtener el nombre para mostrar de una propiedad se puede lograr de varias maneras, incluido el uso de atributos, reflexión y LINQ. A continuación, mostraré cada método individualmente y proporcionaré un código de ejemplo específico.

1. Acceso directo mediante funciones

Al definir una propiedad, puede utilizar el atributo DisplayName para especificar el nombre para mostrar de la propiedad. Este método es el más simple y directo, y es adecuado para situaciones en las que es necesario especificar el nombre para mostrar cuando se diseña el atributo.

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特性已经被附加到属性上

Nota: En .NET Core, es posible que el atributo DisplayName haya quedado obsoleto y es posible que necesite utilizar DisplayAttribute.

2. Utilice el método GetCustomAttribute() para obtenerlo mediante reflexión.

A través de la reflexión, puede obtener dinámicamente atributos personalizados sobre atributos, incluido 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

Si tiene una lista de propiedades y desea consultar propiedades con un nombre para mostrar específico, puede usar LINQ para simplificar el proceso 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;
    }
}

Resumen y comparación

1. Acceso directo mediante atributos: La forma más sencilla es simplemente agregar el atributo DisplayName al atributo. Este método ya determina el nombre para mostrar cuando se define el atributo y no requiere consultas adicionales en tiempo de ejecución.

2. Utilice el método GetCustomAttribute() para obtener mediante reflexión: Obtenga el atributo DisplayAttribute en el atributo mediante la reflexión. Este método obtiene dinámicamente información de atributos en tiempo de ejecución, lo cual es más flexible, pero la sobrecarga de rendimiento es ligeramente mayor que acceder directamente a las funciones.

3. Utilice la consulta LINQ: Consulte una lista de propiedades a través de LINQ para buscar propiedades con un nombre para mostrar específico. Este método es adecuado para filtrar cuando hay una gran cantidad de atributos, pero puede ser demasiado complejo y no es la mejor opción para escenarios simples.

Cada método tiene sus escenarios aplicables. En el desarrollo real, se debe seleccionar el método más apropiado en función de las necesidades específicas y consideraciones de rendimiento. Si hay pocas propiedades y el nombre para mostrar se conoce en el momento de la definición, usar atributos es el enfoque más simple y directo. Si necesita obtener información de atributos de forma dinámica, o hay muchos atributos, puede ser más apropiado utilizar reflexión o LINQ.