VB.NET从可空类型中获取底层system.type

时间:2008-08-31 00:33:31

标签: vb.net reflection dataset

我正在尝试根据对象的属性创建数据集。例如,我有一个Person类的实例,其属性包括ID,Forename,Surname,DOB等。使用反射,我将基于对象属性向新数据集添加列:

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

我的问题是其中一些属性是可空类型,数据集不支持这些类型。有没有办法从可空类型中提取底层系统类型?

感谢。

5 个答案:

答案 0 :(得分:15)

这是你在VB中的答案。对于您的目的而言,这可能是过度的,但对其他人也可能有用。

首先,这里是代码,以确定您是否正在处理Nullable类型:

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

请注意GetType中的异常语法。这是必要的。只是将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

请注意,我在第一行检查Nothing,因为Convert.ChangeType会阻塞它...你可能没有那个问题,但我的情况非常开放。

希望如果我没有直接回答你的问题,你可以蚕食这个并让你到达你需要去的地方 - 但我刚刚实施了这个,而我的测试都已经过去了。

答案 1 :(得分:4)

Nullable.GetUnderylingType(myType)

将返回基础类型,如果它不是可空类型,则返回null。

答案 2 :(得分:1)

我猜这个问题是认识到该属性是否可以为空。在C#中,您可以使用以下代码执行此操作:

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

...但是我不确定VB.NET中最后一个子句的等价物是什么。

答案 3 :(得分:1)

您还可以在该类型上使用GetGenericParameters()方法。 myNullableObject.GetType().GetGenericParameters()[0]应该为您提供可以为空的类型(所以GuidInt32等等。)

答案 4 :(得分:0)

@Mendelt Siebenga:如果变量未设置为null,则只能在value属性上调用GetType;否则,你会得到一个例外。

您要做的是使用“GetValueOrDefault”属性并在其上调用GetType,因为您可以保证它不会为null。例如:

Dim i As Nullable(Of Integer) = Nothing
Dim t As Type = i.GetValueOrDefault().GetType()