.NET 4.0 : How can I get the underlying type of a generic parameter if it is Nullable?

标签 .net generics reflection types

注意:我并不是要确定泛型参数是否可以为 null。我想知道的是,如果它可为空的,那么可为空的基础类型是什么?

这是我正在尝试的:

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 参数传递时,会导致以下错误:

GenericArguments[0]、'System.Nullable1[System.DateTime]',在 'System.Nullable1[T]' 上违反了类型 'T' 的约束。

看来我需要获取基础类型才能使用反射实例化该类型的可空对象。不确定如何绕过这个第 22 条军规。

任何人都可以指出一种方法来判断泛型类型是否可为空,如果是,我如何获取其基础类型?

最佳答案

我将使用 C# 作为示例:

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

关于.NET 4.0 : How can I get the underlying type of a generic parameter if it is Nullable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10536553/

相关文章:

c# - 保护 .NET 代码免遭逆向工程?

c# - 强制 .NET 编写原生波斯数字而不是美国格式

java - 反射安全吗?

Java反射,改变父类(super class)中声明的字段的值

c# - 解析 C# 代码(作为字符串)并插入其他方法

c# - 使用 LINQ 集合中的条件更新字符串

c# - .Net LINQ - 使用另一个字典过滤字典

java - 将泛型与实现相同接口(interface)的枚举类集合一起使用

C# 泛型类型

generics - 使此函数通用时如何满足特征界限?