如何最好地将DbType转换为System.Type?

问题描述:

如何最好地将System.Data.DbType枚举值转换为对应的(或至少一个可能对应的)System.Type值?如何最好地将DbType转换为System.Type?

例如:

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

我只看到很“脏”的解决方案,但没有真正干净。

(是的,这是一个后续行动,我的一个不同的问题,但它使更多的意义,因为两个不同的问题)

AFAIK没有内置在.NET转换器的SqlDbType转换为系统。类型。但了解映射,您可以轻松地将您自己的转换器从简单字典转换为更高级(基于可扩展性的XML)解决方案。

映射可以在这里找到: http://www.carlprothman.net/Default.aspx?tabid=97

System.Data.SqlClient的对象使用元类型组件的DbType和SqlDbType转换为.NET CLR类型。使用反射,如果需要的话,你可以利用这种能力:

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; 
+0

虽然这似乎是工作,我认为这是一个无证的呼叫,可能无法在框架的未来版本和/或可能不提供非.NET的Windows版本? – 2015-01-16 12:11:10