Geeks•ms
Todo lo que los geeks de Windows y .Net tienen que contar
Sigue a Plain Concepts en Twitter
[C# - MOSS 2007]Cómo crear atributos personalizados para Enumerados

Los enumerados son listas constantes agrupables que por defecto empiezan en 0 y que una utilidad es que facilitan a nivel de desarrollo evitar que se pasen valores fuera de rango a objetos, o dato basura, evitar escribir código de validación del parámetro que estamos recibiendo, para encontrar más información básica sobre enumerados aquí, pero cuando trabajamos con enumerados puede darse el caso de que necesitemos extraer su valor equivalente en string y no entero, por ejemplo que para si queremos representar en nuestro sistema un objeto WorkFlowType cuyo valor lo debe extraer de MOSS 2007 en español, pues para este caso como entrada y salida de nuestro sistema necesitamos que el enumerado represente a un string, pues para este caso podemos utilizar un atributo personalizable (ValorString) para poder representar el enumerado de la siguiente manera:

[Serializable]

public enum WorkFlowType

{

[ValorString("Ninguno")]

Empty,

[ValorString("En Serie")]

Serial,

[ValorString("En Paralelo")]

Parallel

};

Para que este código funcione y el compilador no les retorne un error lo que se debe hacer es escribir una clase que represente a un atributo, para esto la clase debe:

  • Heredar de la clase Attribute del espacio de nombres System.
  • Debe contener un campo de tipo string, el constructor debe recibir un string para inicializar el campo, y una propiedad de sólo lectura que retorne el valor que contiene el campo.

La clase completa es:

[Serializable]

public class AtributoValorString : System.Attribute

{

#region Fields

private string _valor;

#endregion

#region Constructor

public AtributoValorString(string parametro)

{

_valor = parametro;

}

#endregion

#region Properties

public string ValorString

{

get { return _valor; }

}

#endregion

}

Para finalizar debemos crear un nuevo método extendido (Extension Method – Nueva característica de lenguaje C# en VS 2008), no olviden agregar el namespace reflection:

using System.Reflection;

[Serializable]

public static class Utilitarios

{

public static string ObtenerValorString(this Enum value)

{

// Obtiene el tipo

Type type = value.GetType();

// Obtiene el fieldinfo para este tipo

FieldInfo fieldInfo = type.GetField(value.ToString());

// Obtiene el atributo ValorString

AtributoValorString [] attribs = fieldInfo.GetCustomAttributes(

typeof(AtributoValorString), false) as AtributoValorString[];

// Retorna el primer elemento.

return attribs.Length > 0 ? attribs[0].StringValue : null;

}

}

Cuando utilicemos el enumerado ahora veremos que podemos utilizar el método extendido que acabamos de crear:

WorkFlowType.Serial.ObtenerValorString()


Enviado 6/8/2008 3:06 por Francisco Fagas
Comparte este post:
El mayor evento de comunidad sobre Windows Azure