注意:我不是要确定泛型参数是否可以为空。我想知道的是,如果它可以为空,那么可以为空的底层类型是什么?
这是我正在尝试的:
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
DateTime?
通过Value
参数传递a时会导致以下错误:
GenericArguments[0], 'System.Nullable
1 [System.DateTime]',在'System.Nullable1[T]' violates the constraint of type 'T'.
看来我需要获取底层类型才能使用反射实例化该类型的可空值。不知道如何绕过这个catch-22。
谁能指出我可以判断泛型类型是否可以为空的方法,如果是,我如何获得它的基础类型?