2008-08-31 10 views
10

オブジェクトのプロパティに基づいてデータセットを作成しようとしています。例えば、私はリフレクションを使用してDOBなどID、Forename、姓、などのプロパティを持つPersonクラスのインスタンスを持って、私は、オブジェクトのプロパティに基づいて新しいデータセットに列を追加している:VB.NET nullable型の基になるsystem.typeを取得する

For Each pi As PropertyInfo In person.GetType().GetProperties() 
    Dim column As New DataColumn(pi.Name, pi.PropertyType) 
    table.Columns.Add(column) 
Next 

私の問題これらのプロパティの一部は、データセットでサポートされていないnull可能な型であるということです。 nullable型から基になるシステム型を抽出する方法はありますか?

ありがとうございました。

答えて

1

私は、問題がプロパティがnullableかどうかを認識していると推測しています。

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) 

...しかし、私はその最後の句の同等はVB.NETであるかわからない:C#では、あなたは、このコードでこれを行います。

+0

if(タイプ.IsGenericType AndAlsoタイプ.GetGenericTypeDefinitionはGetType(Nullable)) –

+0

これは実際にVBへの正しい翻訳ではありません。私の答えをチェックしてください。 –

+0

はい、 'Nullable'と' Nullable <> 'は2種類あります。 –

0

@Mendelt Siebenga:変数がnullに設定されていない場合は、valueプロパティでGetTypeを呼び出すことができます。それ以外の場合は、例外が発生します。

"GetValueOrDefault"プロパティを使用してGetTypeを呼び出します。これはnullでないことが保証されているためです。例:

Dim i As Nullable(Of Integer) = Nothing 
Dim t As Type = i.GetValueOrDefault().GetType() 
2

また、そのタイプのGetGenericParameters()メソッドを使用することもできます。 myNullableObject.GetType().GetGenericParameters()[0]はあなたにnullableの型を与える必要があります(したがってGuidInt32など)

15

ここにあなたの答えはVBです。これはあなたの目的にとって過度のものかもしれませんが、他の人々にとっても役に立つかもしれません。

Private Function IsNullableType(ByVal myType As Type) As Boolean 
    Return (myType.IsGenericType) AndAlso (myType.GetGenericTypeDefinition() Is GetType(Nullable(Of))) 
End Function 

注メソッドGetTypeで珍しい構文:まず第一に

は、ここにあなたがNULL可能タイプを扱っているかどうかを確認するためのコードです。それは必要です。コメント欄の1つとしてGetType(Nullable)を実行するだけで、私にとってうまくいきませんでした。

ので、それで武装し、あなたはORMツールで、私がまたはNULL可能ではないかもしれないジェネリック型に値を取得しようとしています、ここでは...このような何かを行うことができます。

If (Not value Is Nothing) AndAlso IsNullableType(GetType(T)) Then 
    Dim UnderlyingType As Type = Nullable.GetUnderlyingType(GetType(T)) 
    Me.InnerValue = Convert.ChangeType(value, UnderlyingType) 
Else 
    Me.InnerValue = value 
End If 

Convert.ChangeTypeはそれに詰まるので、私は最初の行のNothingをチェックすることに注意してください...あなたはその問題はないかもしれませんが、私の状況は非常に自由です。

私があなたの質問に直接答えなかったなら、あなたはこれを食い止めることができ、あなたが行く必要がある場所にあなたを得ることができます。しかし、私はこの瞬間を前に実装しました。

+0

彼が頼んだのは基礎となるタイプなので、必要なのはNullable.GetUnderlyingTypeだけでした。 –

+0

私は彼がほとんどそれを必要とするだろうと思う。:) –

+0

優れた投稿、私のお尻を保存! – tbone

4
Nullable.GetUnderylingType(myType) 

は、基になる型を返します。nullable型でない場合はnullを返します。

+0

恐ろしく、ありがとう! C#では '' ... is typeof(Nullable <>) 'をコンパイルすることができませんでした(私は後で理由を理解します)ので、ヘッド/デスクの繰り返しの繰り返しから額が完全に節約されました。他のソリューションよりも簡単です。 – Groxx

関連する問題