2012-05-10 8 views
3

注:ジェネリックパラメータがnull可能かどうかを判断するつもりはありません。私が知りたいのは、それ NULL可能である場合、NULL可能の基になる型何で、ですか?ここで .NET 4.0:Nullableの場合、基本パラメータの基本型を取得するにはどうすればよいですか?

は、私がしようとしているものです:

DateTime?Valueパラメータを通過するとき、それは次のようなエラーになり
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 

GenericArguments[0], 'System.Nullable 1 [可能System.DateTime] '' 上のシステム1[T]' violates the constraint of type 'T'.

.Nullable私がリフレクションを使用して、そのタイプのNULL値可能をインスタンス化するために、基になる型を取得する必要があることが表示されます。このキャッチ22を回避する方法は不明です。

誰もが、それは私がその基になる型を得ることができる方法であれば、私は、ジェネリック型がNULL可能であるかどうかを伝えることができウェイに私を指すことができますか?

+5

は、その単純 'Nullable.GetUnderlyingType(typeof演算(T))'ではないでしょうか? –

+1

@MarcGravell:(C#バージョンが)あなたの前の答えはうまくここに収まらなければならないように見えます:http://stackoverflow.com/questions/374651 –

+0

マルク、私はそれが簡単だったなんて信じられません。私の以前のコードはNullable.GetUnderlyingType()を使用していましたが、何らかの理由でnullを返していました。私は明らかに何か間違っていました!私はそれをマークすることができるように答えとして追加してください。 – oscilatingcretin

答えて

3

私は、例えばC#]を使用します:

Type underlyingType = Nullable.GetUnderlyingType(typeof(T)); 
if(underlyingType != null) { 
    .. is nullable, with underlying-type as described 
} 
関連する問題