Mapeador genérico de Enumeraciones

08/09/2009 - 13:37 por Alhambra Eidos Development | Informe spam
Hola a todos,

estoy en este caso, tengo dos enumeraciones así:

namespace WcfServices.Contracts
{
[System.Runtime.Serialization.DataContract]
public enum TipoRol
{
[System.Runtime.Serialization.EnumMember]
NoEspecificado,

[System.Runtime.Serialization.EnumMember]
Tomador,

[System.Runtime.Serialization.EnumMember]
Propietario,
}

y otra enum, con los mismos valores, pero en otro namespace


namespace DomainModel
{
public enum TipoRol
{
NoEspecificado,

Tomador,

Propietario,
}

Quiero crear un EnumMapper generico como este

T EnumMapper<T,K>(value)

Y usarlo de esta forma o similar:

WcfServices.Contracts.TipoRol value1 =
EnumMapper<WcfServices.Contracts.TipoRol, DomainModel.TipoRol>(
DomainModel.TipoRol.Propietario);


DomainModel.TipoRol value2 = EnumMapper<DomainModel.TipoRol,
WcfServices.Contracts.TipoRol >(WcfServices.Contracts..Propietario);

Alguna idea ?

gracias de antemano, saludos

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
08/09/2009 - 17:10 | Informe spam
"Alhambra Eidos Development"
wrote in message
news:
Quiero crear un EnumMapper generico como este

T EnumMapper<T,K>(value)



Puesto que ninguna de las dos enumeraciones tiene asignados valores
numéricos y definen los mismos elementos, en principio las dos asignan los
mismos valores partiendo de cero:

NoEspecificado=0
Tomador=1
Propietario=2

Así pues, con un simple "cast" deberías poder convertir de una a otra,
sin necesidad de interponer el EnumMapper:

DomainModel.TipoRol value2 =
(WcfServices.Contracts.TipoRol)WcfServices.Contracts.Propietario;
Respuesta Responder a este mensaje
#2 Alberto Poblacion
08/09/2009 - 18:20 | Informe spam
"Alberto Poblacion" wrote
in message news:
DomainModel.TipoRol value2 =
(WcfServices.Contracts.TipoRol)WcfServices.Contracts.Propietario;



Perdón, te lo he puesto al revés. El cast es al tipo de destino:

DomainModel.TipoRol value2 (DomainModel.TipoRol)WcfServices.Contracts.Propietario;
Respuesta Responder a este mensaje
#3 Alhambra Eidos Development
09/09/2009 - 08:06 | Informe spam
Hola, gracias,

dos cosas:

1. Se puede hacer una función para ese "cast" ??

Al estilo de Convertir (jasoft.org)

public static T Convertir<T>(object v)
{
try
{
return (T) Convert.ChangeType(v, typeof(T));
}
catch
{
return (T) Activator.CreateInstance(typeof(T));
}
}



2. Si no tuvieran el mismo valor numérico, habría alguna solución ?

Saludos y muchas gracias.
Respuesta Responder a este mensaje
#4 Alberto Poblacion
09/09/2009 - 09:12 | Informe spam
"Alhambra Eidos Development"
wrote in message
news:
1. Se puede hacer una función para ese "cast" ??




Sí, se puede meter dentro de una función, pero es no es demasiado útil:
Escribir el "cast" es igual de fácil que escribir una llamada a la función,
y el "overhead" en tiempo de ejecución es mucho menor si tienes solamente el
cast que si tienes que ejecutar una llamada a la función (salvo que el
compilador tenga la amabilidad de optimizarla metiendo el contenido
"inline").

public static DomainModel.TipoRol Convertir(WcfServices.Contracts.TipoRol v)
{
return (DomainModel.TipoRol ) v;
}

2. Si no tuvieran el mismo valor numérico, habría alguna solución ?

Una solución sería escribir una función con un "switch" que tenga cada
uno de los posibles valores.

Otra sería usar el método .ToString() para sacar el nombre del primer
enum a partir de su valor numérico, y luego con ese nombre usar Enum.Parse()
para construir el segundo enum. La ejecución resultará bastante lenta en
comparación con la asignación directa del valor numérico.

Quedaría algo parecido a lo siguiente (puede que tenga algún error, no
lo he probado):

public static T EnumMapper<T,K>(K value)
{
string s = value.ToString();
T e = (T)Enum.Parse(typeof(T), s);
return e;
}
Respuesta Responder a este mensaje
#5 Alhambra Eidos Development
09/09/2009 - 09:38 | Informe spam
Hola,

hice esta, casi igual que la suya:

/// <summary>
/// Convertirs the specified valor de enumeracion.
///
/// Enum1 e1 = Enum1.B;
/// Enum2 e2 = (Enum2)Enum.Parse(typeof(Enum2), e1.ToString());
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="valorDeEnumeracion">The valor de enumeracion.</param>
/// <returns></returns>
public static T Convertir<T>(string valorDeEnumeracion)
{
T enumDestino = (T)Enum.Parse(typeof(T), valorDeEnumeracion);
return enumDestino;
}

Tengo que probarla, pero como comenta puede mermar el rendimiento, no?


Quedaría algo parecido a lo siguiente (puede que tenga algún error, no
lo he probado):

public static T EnumMapper<T,K>(K value)
{
string s = value.ToString();
T e = (T)Enum.Parse(typeof(T), s);
return e;
}
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida