2008-09-18 5 views
9

Как наилучшим образом преобразовать значение перечисления System.Data.DbType в соответствующее (или, по крайней мере, одно из возможных) значений System.Type?Как лучше всего преобразовать DbType в System.Type?

Например:

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

Я видел только очень «грязное» решение, но ничего действительно чистый.

(да, это прослеживание на другой мой вопрос, но он сделал больше смысла, так как две отдельные вопросы)

ответ

6

AFAIK нет встроенного преобразователя в .NET для преобразования SqlDbType в системе .Тип. Но, зная сопоставление, вы можете легко свернуть собственный конвертер, начиная от простого словаря и заканчивая более продвинутыми решениями (основанных на XML).

отображения можно найти здесь: http://www.carlprothman.net/Default.aspx?tabid=97

4

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

В то время как это, кажется, работает, я предполагаю, что это недокументированная вызов, который не может быть доступна в будущих версиях Framework и/или не могут быть доступны на не -Windows-версии .NET? – 2015-01-16 12:11:10