DbType を System.Type に変換するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/91160

  •  01-07-2019
  •  | 
  •  

質問

System.Data.DbType 列挙値を対応する (または対応する可能性のある少なくとも 1 つの) System.Type 値に変換するにはどうすればよいですか?

例えば:

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

私は非常に「汚い」ソリューションしか見たことがありませんが、本当にきれいなものはありません。

(はい、これは私の別の質問のフォローアップですが、2 つの別々の質問として理解したほうが理にかなっています)

役に立ちましたか?

解決

私の知る限り、.NET には SqlDbType を System.Type に変換するための組み込みコンバーターがありません。ただし、マッピングを理解すれば、単純な辞書からより高度な (拡張性を目的とした XML ベースの) ソリューションに至るまで、独自のコンバーターを簡単に作成できます。

マッピングは次の場所にあります。http://www.carlprothman.net/Default.aspx?tabid=97

他のヒント

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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top