Pregunta

¿Para qué tipo de cosas ha utilizado atributos .NET personalizados en el mundo real?

He leído varios artículos sobre ellos, pero nunca he usado atributos personalizados.

Siento que podría pasarlos por alto cuando podrían ser útiles.

Estoy hablando de los atributos que crea, no de los que ya están incluidos en el marco.

¿Fue útil?

Solución

Los he usado "personalizado" atributos para la validación (es decir, marcar un campo para ser validado con mi propia "validación de tarjeta de crédito") y analizadores LinqToLucene personalizados que he escrito (es decir, especificar qué analizador usar en un campo determinado).

El código de validación, por ejemplo, se vería así:

public class Customer
{
     [CreditCardValidator]
     string creditCardNumber;

     [AddressValidator]
     string addressLineOne
}

Cuando se valida el objeto anterior, cada campo se valida con el validador apropiado gracias a la "costumbre" atributo.

En las cosas de LinqToLucene que he escrito, los atributos personalizados son buenos porque te permiten encontrar (a través de la reflexión) campos específicos en tiempo de ejecución. Por ejemplo, si tiene un objeto de cliente, puede estar interesado en obtener todas las propiedades que se han marcado como '' index me '': un atributo personalizado le permite hacerlo fácilmente, ya que expone los metadatos sobre el objeto de una manera eso es fácil de consultar.

Otros consejos

Creé un motor de secuencias de comandos y etiqueté varios métodos con el atributo [Comando]. Esto significaba que estas funciones estaban expuestas al motor de secuencias de comandos.

Ejemplo:

[Command(HelpText = "Lists active users")]
void ListUsers(void)
{

}

[Command(HelpText = "Terminate a specific user's connection")]
void EndConnection(int userID)
{

}

Y como se usa:

MyScriptEngine>>  Help
Available Commands are:
    ListUsers: Lists active users
    EndConnection {userID}: Terminate a specific user's connection

MyScriptEngine>> EndConnection 3
    User 3 (Michael) has had his connection terminated.

MyScriptEngine>>

Entre otras cosas, las he usado para especificar EBNF que se lee en tiempo de ejecución para crear analizadores personalizados sobre la marcha y también para especificar metadatos sobre campos para una base de datos.

Encuentro que un 'patrón' que uso habitualmente con atributos personalizados es reemplazar las enumeraciones, especialmente cuando hay una dependencia de la enumeración en diferentes lugares del código.

Por ejemplo. Podría tener una enumeración para el estado de un objeto. Basado en este estado, tengo quizás 3 o 4 lugares diferentes en el código que haría un 'cambio' de esa enumeración y realizaría alguna operación. Algún otro desarrollador podría introducir fácilmente un error agregando una nueva enumeración pero no manejando una de las declaraciones de cambio en otro lugar del código.

Entonces, para evitar esto, creo atributos personalizados declarados a una clase estática. Los atributos personalizados se cargan en el constructor estático de la clase en un diccionario y todos los lugares en el código usan el diccionario en lugar de las declaraciones de cambio. El constructor de atributos personalizados contiene los valores 'codificados' para cada instrucción de cambio.

Tuve que serializar algunos objetos a un formato personalizado (heredado) y usé atributos para identificar qué campos deberían serializarse y cómo formatearlos. Luego tuve un serializador que podía tomar cualquier objeto con estos atributos y usar la reflexión para formatearlo.

Todavía no he encontrado un uso para los atributos personalizados hasta el momento. Hubo algunas situaciones en las que pensé que podrían ser apropiadas pero no las usé porque aparentemente la reflexión involucrada en la lectura de atributos personalizados es bastante costosa.

He colocado atributos personalizados en clases dentro de " plug-in " DLL. Esto permite que un marco descubra dinámicamente los complementos disponibles, evalúe si son de interés y luego cargue dinámicamente los de interés.

En nuestro dominio, el ejemplo son complementos que modelan vehículos particulares dentro de una familia. Un complemento para una familia de vehículos podría modelar varios modelos de vehículos dentro de la familia de vehículos (por ejemplo, "MX-6", "Sonda"). Si se incluye una identificación o nombre de modelo como una matriz de atributos personalizados, podemos ignorar rápidamente cualquier DLL que ni siquiera tenga atributos personalizados, y luego ignorar aún más las que no modelen el vehículo de interés.

Lo había usado en uno de los marcos ORM que desarrollé basado en el patrón ActiveRecord. Este es el mismo tipo de implementación que está disponible en LINQ, proyecto Castle, etc.

El marco se llamaba "SkyFramework", pero no era de código abierto.

por ej. Solo un ejemplo aproximado ...

También encontrará ejemplos similares en otros proyectos de código abierto.

[Sky.Table ("user")]
public class User
{
    [Sky.Column ("username")]
    public string UserName;

    [Sky.Column ("pwd")]
    public string Password;
}

NOTA: El atributo " Tabla " ;, " Columnas " eran los atributos personalizados en ese momento.

El motor ActiveRecord analiza el objeto para estos atributos y genera las funciones respectivas para CRUD ... etc ...

Del mismo modo, desarrollé algunos atributos personalizados para identificar partes del código que deben ser comparadas ... por ejemplo ...

[Sky.BenchMark()]
public void LongRunningMethod(..)
{
}

Los métodos marcados con los atributos anteriores se marcan automáticamente y se genera un registro. Estas fueron algunas implementaciones anteriores.

Hay un libro de Apress disponible sobre el tema. Atributos de .NET aplicados que pueden ser de ayuda para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top