私はデータベースからロードされた情報を保持するために使用している汎用クラスを持っています。書き込み時にすべての型が不明な場合は、値型を汎用オブジェクトのnull可能な列挙型にキャストしますか?
は、私はそのような、引数としてのDataRowを取るオブジェクトの知られている列名を使用したDataRowからデータを抽出する方法を、持っている:ほとんどの場合、私のデフォルトの割り当てなど
Dim loadData As T = CType(myDataRow("myColumnName"), T))
作品。
残念なことに、いくつかの恐ろしいデザインの制約のため、一部の列がヌルになることがあります。また、列挙型から取り出すこともできます。
これは<T>
がNullable(Of SomeEnumeration)
あるとき、私はSomeEnumeration.Zero
に直接0
をキャストすることはできませんので、上記のコードは動作しないことを意味します。
<T>
がNullable(Of [Enum])
かどうかを確認する方法はありますか?あるいは、Integers
をNullable(Of [Enum])
にキャストできるメソッドを書くための何らかの方法ですか?
私はこれらのうちの1つを書くことができる何かを忘れているように感じるが、私の弱いgoogle-fuは何も上がらない。
EDIT:さて、以下dasblinkenlightの答えのおかげで、私はこのような状況が発生しているときを検出、しかし、私は今行う必要があることは、私がNullable(Of SomeClass)
知っているタイプ<T>
を取ることです、SomeClass
への型参照を取得することができますタイプNullable(Of SomeClass)
の新しいオブジェクトを作成し、それをLoadDataに割り当てます。
私が試したすべてが崩壊します。何か案は?
EDIT 2:
その列挙値の値を取得するための私のソリューションでした:
Dim baseType As Type = Nullable.GetUnderlyingType(GetType(T))
loadData = [Enum].Parse(baseType, dataRowIn(Me._dataName))
私の問題は、私はbaseType
を受け入れる任意の関数を見つけることの困難の多くを持っていたということでした実際のタイプとして
[Enum] .Parse acceptedパラメーターとして、baseType
はdasblinkenlightのコードのために[Enum]タイプであるとわかっていました。このインスタンスではソリューションをコーディングすることができました。それは私の問題に非常に特有の解決策です(すなわち、T
はNullable(of SomeEnumeration)
です)。それにもかかわらず解決策です。
http://stackoverflow.com/a/5199474/284240 –
この他のSO投稿から、これは読んでみる価値があります。http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/ representation-and-identity.aspx –
Dim loadData T = myDataRow.Field(Of T)( "myColumnName")と同様のものを使用しますか? –