10

オブジェクトのプロパティに基づいてデータセットを作成しようとしています。たとえば、ID、Forename、Surname、DOB などのプロパティを持つ Person クラスのインスタンスがあります。リフレクションを使用して、オブジェクト プロパティに基づいて新しいデータセットに列を追加しています。

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

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

ありがとう。

4

5 に答える 5

16

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

まず、Nullable 型を扱っているかどうかを確認するコードを次に示します。

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

GetType の特殊な構文に注意してください。それは必要です。コメンテーターの1人が提案したように GetType(Nullable) を実行するだけではうまくいきませんでした。

それで、それで武装して、あなたはこのようなことをすることができます...ここでは、ORMツールで、Nullableであるかどうかにかかわらず、ジェネリック型に値を取得しようとしています:

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 をチェックすることに注意してください...あなたはその問題を抱えていないかもしれませんが、私の状況は非常に無制限です。

うまくいけば、私があなたの質問に直接答えなかった場合、これを共食いして、必要な場所に到達できることを願っています-しかし、私はこれを少し前に実装したばかりで、私のテストはすべて合格しています.

于 2009-04-15T16:43:29.070 に答える
4
Nullable.GetUnderylingType(myType)

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

于 2010-01-08T14:56:24.500 に答える
1

GetGenericParameters()そのタイプのメソッドを 使用することもできます。null許容型(so 、、など)myNullableObject.GetType().GetGenericParameters()[0]を指定する必要がありますGuidInt32

于 2008-09-04T16:23:39.150 に答える
1

問題は、プロパティが null 可能かどうかを認識していると推測しています。C# では、次のコードでこれを行います。

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

...しかし、その最後の句に相当するものがVB.NETにあるかどうかはわかりません。

于 2008-08-31T00:46:07.973 に答える
0

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

あなたがしたいのは、「GetValueOrDefault」プロパティを使用し、その上でGetTypeを呼び出すことです。これは、nullにならないことが保証されているためです。例:

Dim i As Nullable(Of Integer) = Nothing
Dim t As Type = i.GetValueOrDefault().GetType()
于 2008-09-04T16:18:54.780 に答える