Pregunta

¿Cuál es la mejor manera de convertir un valor de enumeración System.Data.DbType al valor System.Type correspondiente (o al menos a uno de los posibles correspondientes)?

Por ejemplo:

DbType.StringFixedLength -> System.String 
DbType.String -> System.String
DbType.Int32 -> System.Int32

Sólo he visto soluciones muy "sucias" pero nada realmente limpio.

(sí, es una continuación de una pregunta mía diferente, pero tenía más sentido como dos preguntas separadas)

¿Fue útil?

Solución

AFAIK, no existe un convertidor incorporado en .NET para convertir un SqlDbType a un System.Type.Pero conociendo el mapeo, puedes implementar fácilmente tu propio convertidor, desde un simple diccionario hasta soluciones más avanzadas (basadas en XML para mayor extensibilidad).

El mapeo se puede encontrar aquí:http://www.carlprothman.net/Default.aspx?tabid=97

Otros consejos

Los objetos System.Data.SqlClient utilizan el componente MetaType para traducir DbType y SqlDbType a tipos .NET CLR.Usando la reflexión, podrías aprovechar esta habilidad si fuera necesario:

var dbType = DbType.Currency;

Type metaClrType = Type.GetType(
    "System.Data.SqlClient.MetaType, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
    true,
    true
    );

object metaType = metaClrType.InvokeMember(
    "GetMetaTypeFromDbType",
    BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.NonPublic,
    null,
    null,
    new object[] { dbType }
);

var classType = (Type)metaClrType.InvokeMember(
    "ClassType",
    BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic,
    null,
    metaType,
    null
);

string cSharpDataType = classType.FullName;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top