Como faço para melhor converter um DbType para System.Type?
Pergunta
Como faço para melhor converter um valor System.Data.DbType enumeração para o correspondente (ou pelo menos um dos possíveis correspondente) valores System.Type?
Por exemplo:
DbType.StringFixedLength -> System.String
DbType.String -> System.String
DbType.Int32 -> System.Int32
Eu só vi próprias soluções "sujas", mas nada realmente limpo.
(sim, é um seguimento a uma pergunta diferente da minha, mas fazia mais sentido como duas questões separadas)
Solução
AFAIK não há nenhum conversor embutido em .NET para converter um SqlDbType a um System.Type. Mas saber o mapeamento pode facilmente rolar o seu próprio conversor variando de um dicionário mais simples ao mais avançado (baseado em XML para extensability) soluções.
O mapeamento pode ser encontrada aqui: http://www.carlprothman.net/Default.aspx?tabid=97
Outras dicas
objetos System.Data.SqlClient usar o componente MetaType para traduzir DbType e SqlDbType para Tipos .NET CLR. Usando a reflexão, você pode aproveitar essa capacidade, se necessário:
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;