【问题标题】:How do I best convert a DbType to System.Type?如何最好地将 DbType 转换为 System.Type?
【发布时间】:2010-09-10 14:35:24
【问题描述】:

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

例如:

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

我只见过非常“肮脏”的解决方案,但没有真正干净的解决方案。

(是的,这是我另一个问题的后续,但作为两个单独的问题更有意义)

【问题讨论】:

    标签: .net converter


    【解决方案1】:

    AFAIK .NET 中没有用于将 SqlDbType 转换为 System.Type 的内置转换器。但是了解映射后,您可以轻松推出自己的转换器,从简单的字典到更高级(基于 XML 以实现可扩展性)的解决方案。

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

    【讨论】:

      【解决方案2】:

      System.Data.SqlClient 对象使用 MetaType 组件将 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;
      

      【讨论】:

      • 虽然这似乎可行,但我认为这是一个未记录的调用,可能在未来的框架版本中不可用和/或在非 Windows 版本的 .NET 上可能不可用?跨度>
      猜你喜欢
      • 2010-09-10
      • 2011-03-29
      • 2010-10-27
      • 2016-04-04
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多