むかし、派手に使いまくってたっていうぜ?
処理するうえで、とっても困っていた事。
えくすてんしょん、で、えくすくらめーしょん
http://blogs.wankuma.com/esten/archive/2010/04/25/188400.aspx
を使っていたのはよいのだけれど、ふと、気付いた。
DBNullとNothingは異なる、ってこと。
今回のケース、DataTableからLINQしてList(of 別のクラス)を生成し、
また、List(of 別のクラス)の中身をDataTableと同期させたりとかしてるんだけど、
DBNullとなっている列のデータは、Nothingにしておかないとクラス内では都合が悪い
Nothingのクラスプロパティは、DBNullになってくれないと、DataTable内では都合が悪い
というわけで、コンバータが必要になっちゃったのね。
でも、関数だといちいち書くのめんどいから、
どうせならObject型の拡張メソッドにしちゃえ、ということで頑張ってみた。
まずは「クラスライブラリプロジェクト」を作成。
そこにクラスを追加して、Object型への拡張なので、それらしい名前をつけておく。
Imports System.Runtime.CompilerServices
Public Module ObjectExtentions
<Extension()> _
Public Function NVL(ByVal invalue As Object) As Object
Select Case True
Case IsDBNull(invalue)
Return Nothing
Case invalue Is Nothing
Return DBNull.Value
Case Else
Return invalue
End Select
End Function
End Module
メソッド名は、自分が使いなれている(!)NVL、と名付けてコンバータを作成。簡単なロジックw
ちなみに、パラメータにObjectを指定すると、
CompilerServicesの方で、「あ、これObject型用の拡張なのね」と判断してくれる。
そして、プロジェクト生成のところで、ルート名前空間に「System」を指定
はい、リビルドー!オブジェクトブラウザで、できているのを確認!
そして、これを、使いたい処理プロジェクトで参照追加しておくと、
インテリセンスでも存在確認!
サンプルの是非はおいといて(テケトーだから)、オブジェクト型に拡張したから、何にでも付けられちゃうゾw
というわけで、これで、どんな型でも必要に応じてコンバーター処理できるようになりましたですよ。
拡張メソッド (Visual Basic)
http://msdn.microsoft.com/ja-jp/library/bb384936.aspx
くわしくは、こちらにね。