Как мне лучше всего конвертировать DbType в System.Type? - PullRequest
9 голосов
/ 18 сентября 2008

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

Например:

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

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

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

Ответы [ 2 ]

6 голосов
/ 18 сентября 2008

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

Сопоставление можно найти здесь: http://www.carlprothman.net/Default.aspx?tabid=97

4 голосов
/ 04 сентября 2013

Объекты 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;
...