我正在尝试根据对象的属性创建数据集。例如,我有一个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
我的问题是其中一些属性是可空类型,数据集不支持这些类型。有没有办法从可空类型中提取底层系统类型?
感谢。
答案 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]
应该为您提供可以为空的类型(所以Guid
,Int32
等等。)
答案 4 :(得分:0)
@Mendelt Siebenga:如果变量未设置为null,则只能在value属性上调用GetType;否则,你会得到一个例外。
您要做的是使用“GetValueOrDefault”属性并在其上调用GetType,因为您可以保证它不会为null。例如:
Dim i As Nullable(Of Integer) = Nothing
Dim t As Type = i.GetValueOrDefault().GetType()