3

注: ジェネリック パラメーターが null 可能かどうかを判断しようとしているわけではありません。私が知りたいのは、nullable の場合 nullable の基になる型は何ですか?

ここに私がしようとしているものがあります:

Function CreateTdParameter(Of T)(Name As String, Value As T) As TdParameter

    Dim TdType As TdType
    Dim ValueType As Type = GetType(T)

    If ValueType.IsGenericType Then
        Dim GenType As Type = ValueType.GetGenericTypeDefinition()
        If GenType = GetType(Nullable(Of )) Then
            ValueType = Activator.CreateInstance(GenType.MakeGenericType(New Type() {ValueType}))
            ValueType = Nullable.GetUnderlyingType(ValueType.GetGenericTypeDefinition().UnderlyingSystemType)
        End If
    End If

    If ValueType = GetType(String) Then
        TdType = Teradata.Client.Provider.TdType.VarChar
    ElseIf ValueType = GetType(Integer) Then
        TdType = Teradata.Client.Provider.TdType.Integer
    ElseIf ValueType = GetType(DateTime) Then
        TdType = Teradata.Client.Provider.TdType.Timestamp
    Else
        Throw New NotImplementedException(String.Format("{0} not expected.", Value.GetType))
    End If

    Return CreateTdParameter(Name, Value, TdType, ParameterDirection.Input)

End Function

a がパラメーターDateTime?を介して渡されると、次のエラーが発生します。Value

GenericArguments[0], 'System.Nullable1[System.DateTime]'、'System.Nullable1[T]' violates the constraint of type 'T'.

リフレクションを使用してその型の nullable をインスタンス化するには、基になる型を取得する必要があるようです。このキャッチ 22 を回避する方法がわかりません。

ジェネリック型が null 可能であるかどうかを確認できる方法と、そうであれば、基になる型を取得する方法を教えてもらえますか?

4

1 に答える 1

3

例として C# を使用します。

Type underlyingType = Nullable.GetUnderlyingType(typeof(T));
if(underlyingType != null) {
    .. is nullable, with underlying-type as described
}
于 2012-05-10T14:53:30.807 に答える