Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[Tutorial] C# Atributos [PROFESIONAL]
#1


Tutorial de atributos
Visual Studio .NET 2003
Este tutorial muestra cómo crear clases de atributos personalizados, utilizarlos en el código y consultarlos a través del mecanismo de reflexión.

Archivos de ejemplo

Vea Ejemplo de atributos para descargar y generar los archivos de ejemplo que se utilizan en este tutorial.

Información adicional

Atributos de C#
17. Atributos
AttributeUsage
Descubrir información de tipos en tiempo de ejecución
Tutorial

Los atributos constituyen un medio apropiado para asociar información declarativa con código de C# (tipos, métodos, propiedades, etc.). Una vez asociado con una entidad del programa, el atributo se puede consultar en tiempo de ejecución y utilizar de varias formas.

Entre los ejemplos de uso de atributos, se incluyen:

Asociar la documentación con entidades de programa (por medio de un atributo Help).
Asociar editores de valor con un tipo específico en una plataforma de interfaz de usuario (mediante un atributo ValueEditor).
Además de un completo ejemplo, este tutorial incluye los siguientes temas:

Declarar una clase Attribute
Lo primero que se necesita para hacerlo es declarar un atributo.

Utilizar una clase Attribute
Una vez que se ha creado el atributo, se asocia éste con un determinado elemento del programa.

Acceso a atributos mediante reflexión
Una vez que el atributo se ha asociado con un elemento del programa, se utiliza la reflexión para consultar su existencia y su valor.

Declarar una clase Attribute

Declarar un atributo en C# es simple: se utiliza la forma de una declaración de clase que hereda de System.Attribute y que se ha marcado con el atributo AttributeUsage, como se indica a continuación:

using System;
[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : System.Attribute
{
public readonly string Url;

public string Topic // Topic is a named parameter
{
get
{
return topic;
}
set
{

topic = value;
}
}

public HelpAttribute(string url) // url is a positional parameter
{
this.Url = url;
}

private string topic;
}
Descripción del código

El atributo AttributeUsage especifica los elementos del lenguaje a los que se puede aplicar el atributo.
Las clases de atributos son clases públicas derivadas de System.Attribute que disponen al menos de un constructor público.
Las clases de atributos tienen dos tipos de parámetros:
Parámetros posicionales, que se deben especificar cada vez que se utiliza el atributo. Los parámetros posicionales se especifican como argumentos de constructor para la clase de atributo. En el ejemplo anterior, url es un parámetro posicional.
Parámetros con nombre, los cuales son opcionales. Si se especifican al usar el atributo, debe utilizarse el nombre del parámetro. Los parámetros con nombre se definen mediante un campo o una propiedad no estáticos. En el ejemplo anterior, Topic es un parámetro con nombre.
Los parámetros de un atributo sólo pueden ser valores constantes de los siguientes tipos:
Tipos simples (bool, byte, char, short, int, long, float y double)
string
System.Type
enumeraciones
object (El argumento para un parámetro de atributo del tipo object debe ser un valor constante de uno de los tipos anteriores.)
Matrices unidimensionales de cualquiera de los tipos anteriores
Parámetros para el atributo AttributeUsage

El atributo AttributeUsage proporciona el mecanismo subyacente mediante el cual los atributos se declaran.

AttributeUsage tiene un parámetro posicional:

AllowOn, que especifica los elementos de programa a los que se puede asignar el atributo (clase, método, propiedad, parámetro, etc.). Los valores aceptados para este parámetro se pueden encontrar en la enumeración System.Attributes.AttributeTargets de .NET Framework. El valor predeterminado para este parámetro es el de todos los elementos del programa (AttributeElements.All).
AttributeUsage tiene un parámetro con nombre:

AllowMultiple, valor booleano que indica si se pueden especificar varios atributos para un elemento de programa. El valor predeterminado para este parámetro es False.
Utilizar una clase Attribute

A continuación, se muestra un breve ejemplo de uso del atributo declarado en la sección anterior:

[HelpAttribute("http://localhost/MyClassInfo")]
class MyClass
{
}
En este ejemplo, el atributo HelpAttribute está asociado con MyClass.

Nota Por convención, todos los nombres de atributo finalizan con la palabra "Attribute" para distinguirlos de otros elementos de .NET Framework. No obstante, no tiene que especificar el sufijo de atributo cuando utiliza atributos en el código. Por ejemplo, puede especificar HelpAttribute de esta manera:
[Help("http://localhost/MyClassInfo")] // [Help] == [HelpAttribute]
class MyClass
{
}
Acceso a atributos mediante reflexión

Una vez que los atributos se han asociado con elementos del programa, se puede utilizar el mecanismo de reflexión para consultar su existencia y su valor. Los principales métodos de reflexión para consultar atributos se encuentran en la clase System.Reflection.MemberInfo (familia de métodos GetCustomAttributes). El siguiente ejemplo muestra la manera básica de utilizar la reflexión para obtener acceso a los atributos:

class MainClass
{
public static void Main()
{
System.Reflection.MemberInfo info = typeof(MyClass);
object[] attributes = info.GetCustomAttributes(true);
for (int i = 0; i < attributes.Length; i ++)
{
System.Console.WriteLine(attributes[i]);
}
}
}
Ejemplo

El siguiente es un ejemplo completo en el que se juntan todas las piezas.

// AttributesTutorial.cs
// This example shows the use of class and method attributes.

using System;
using System.Reflection;
using System.Collections;

// The IsTested class is a user-defined custom attribute class.
// It can be applied to any declaration including
// - types (struct, class, enum, delegate)
// - members (methods, fields, events, properties, indexers)
// It is used with no arguments.
public class IsTestedAttribute : Attribute
{
public override string ToString()
{
return "Is Tested";
}
}

// The AuthorAttribute class is a user-defined attribute class.
// It can be applied to classes and struct declarations only.
// It takes one unnamed string argument (the author's name).
// It has one optional named argument Version, which is of type int.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class AuthorAttribute : Attribute
{
// This constructor specifies the unnamed arguments to the attribute class.
public AuthorAttribute(string name)
{
this.name = name;
this.version = 0;
}

// This property is readonly (it has no set accessor)
// so it cannot be used as a named argument to this attribute.
public string Name
{
get
{
return name;
}
}

// This property is read-write (it has a set accessor)
// so it can be used as a named argument when using this
// class as an attribute class.
public int Version
{
get
{
return version;
}
set
{
version = value;
}
}

public override string ToString()
{
string value = "Author : " + Name;
if (version != 0)
{
value += " Version : " + Version.ToString();
}
return value;
}

private string name;
private int version;
}

// Here you attach the AuthorAttribute user-defined custom attribute to
// the Account class. The unnamed string argument is passed to the
// AuthorAttribute class's constructor when creating the attributes.
[Author("Joe Programmer")]
class Account
{
// Attach the IsTestedAttribute custom attribute to this method.
[IsTested]
public void AddOrder(Order orderToAdd)
{
orders.Add(orderToAdd);
}

private ArrayList orders = new ArrayList();
}

// Attach the AuthorAttribute and IsTestedAttribute custom attributes
// to this class.
// Note the use of the 'Version' named argument to the AuthorAttribute.
[Author("Jane Programmer", Version = 2), IsTested()]
class Order
{
// add stuff here ...
}

class MainClass
{
private static bool IsMemberTested(MemberInfo member)
{
foreach (object attribute in member.GetCustomAttributes(true))
{
if (attribute is IsTestedAttribute)
{
return true;
}
}
return false;
}

private static void DumpAttributes(MemberInfo member)
{
Console.WriteLine("Attributes for : " + member.Name);
foreach (object attribute in member.GetCustomAttributes(true))
{
Console.WriteLine(attribute);
}
}

public static void Main()
{
// display attributes for Account class
DumpAttributes(typeof(Account));

// display list of tested members
foreach (MethodInfo method in (typeof(Account)).GetMethods())
{
if (IsMemberTested(method))
{
Console.WriteLine("Member {0} is tested!", method.Name);
}
else
{
Console.WriteLine("Member {0} is NOT tested!", method.Name);
}
}
Console.WriteLine();

// display attributes for Order class
DumpAttributes(typeof(Order));

// display attributes for methods on the Order class
foreach (MethodInfo method in (typeof(Order)).GetMethods())
{
if (IsMemberTested(method))
{
Console.WriteLine("Member {0} is tested!", method.Name);
}
else
{
Console.WriteLine("Member {0} is NOT tested!", method.Name);
}
}
Console.WriteLine();
}
}
Resultado

Attributes for : Account
Author : Joe Programmer
Member GetHashCode is NOT tested!
Member Equals is NOT tested!
Member ToString is NOT tested!
Member AddOrder is tested!
Member GetType is NOT tested!

Attributes for : Order
Author : Jane Programmer Version : 2
Is Tested
Member GetHashCode is NOT tested!
Member Equals is NOT tested!
Member ToString is NOT tested!
Member GetType is NOT tested!
#2
ese lenguaje se ve un poco dificil, pero lo voy aprender
#3
@foro yo en lo personal no recomiendo aprender C# para eso C o C++ Y si quieres algo más orientado a objetos, San JAVA xD

Buen tuto, +tanks
WWW
#4
(15-02-2012, 02:19 AM)foro escribió: ese lenguaje se ve un poco dificil, pero lo voy aprender

No es difícil bro, en serio que no es difícil de aprender, al contrario es súper fácil y comodo programar en C#.

En cuanto a C/C++ son excelentes lenguajes, pero C# también tiene lo suyo =).
#5
Estupendo, pero deberias editar el tema para envolver el codigo en los mycodes correspondientes
WWW


Posibles temas similares...
Tema Autor Respuestas Vistas Último mensaje
Información [Tutorial] Certificado SSL Gratis StartSSL 2016 Tutorial DarkMaster 26 5,103 28-04-2016, 03:39 AM
Último mensaje: Lob3zNo
  5 atributos impresionantes de un diseñador de éxito CarlosAlberto 0 245 07-01-2016, 02:37 AM
Último mensaje: CarlosAlberto
Bombilla [Tutorial] SSL Gratis, Conseguir e Instalar Certificado DarkMaster 16 871 06-01-2016, 01:32 AM
Último mensaje: DarkMaster
  [PUBLICO] Tutorial Botones con perspectiva 3D AngelKrak 0 233 17-01-2015, 05:44 AM
Último mensaje: AngelKrak
  [Tutorial] Aumentar el Tamaño Máximo al Cargar Archivos con PHP y Apache papanoel 0 667 22-01-2014, 04:38 AM
Último mensaje: papanoel
  Tutorial Css Primera Parte para phpost JNeutron 4 1,051 24-02-2013, 04:01 AM
Último mensaje: Echizen
  [TUTORIAL] Conexión a una Base de Datos desde [PHP] lapipichapa 0 490 15-02-2013, 05:52 PM
Último mensaje: lapipichapa
  Tutorial de .htaccess | Control de acceso a carpetas diringax 11 1,452 13-01-2013, 12:28 PM
Último mensaje: papi
  [TUTORIAL] Como evitar el Hotlinkeo (robo de imágenes) Taquion 8 1,686 12-01-2013, 05:50 PM
Último mensaje: natestale
  Tutorial | Crear Sistema de Login PHP diringax 13 1,741 18-12-2012, 01:49 AM
Último mensaje: BrayanFG



Usuarios navegando en este tema: 1 invitado(s)