¿Cuál es la mejor manera de convertir un DbType a System.Type?
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)
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;