10

我正在尝试基于对象的属性创建数据集。例如,我有一个 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

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

谢谢。

4

5 回答 5

16

这是您在 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 会阻塞它......你可能没有这个问题,但我的情况非常开放。

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

于 2009-04-15T16:43:29.070 回答
4
Nullable.GetUnderylingType(myType)

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

于 2010-01-08T14:56:24.500 回答
1

您也可以GetGenericParameters()在该类型上使用该方法。 myNullableObject.GetType().GetGenericParameters()[0]应该给你它的可空类型(所以GuidInt32等)

于 2008-09-04T16:23:39.150 回答
1

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

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

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

于 2008-08-31T00:46:07.973 回答
0

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

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

Dim i As Nullable(Of Integer) = Nothing
Dim t As Type = i.GetValueOrDefault().GetType()
于 2008-09-04T16:18:54.780 回答