我正在尝试基于对象的属性创建数据集.例如,我有一个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
Run Code Online (Sandbox Code Playgroud)
我的问题是,其中一些属性是可空类型,数据集不支持这些类型.有没有办法从可空类型中提取底层系统类型?
谢谢.
Bri*_*Kay 15
这是你在VB中的答案.这可能对你的目的来说太过分了,但它也可能对其他人有用.
首先,这里是代码,以了解您是否正在处理Nullable类型:
Private Function IsNullableType(ByVal myType As Type) As Boolean
Return (myType.IsGenericType) AndAlso (myType.GetGenericTypeDefinition() Is GetType(Nullable(Of )))
End Function
Run Code Online (Sandbox Code Playgroud)
请注意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
Run Code Online (Sandbox Code Playgroud)
请注意,我在第一行检查Nothing因为Convert.ChangeType会阻塞它...你可能没有那个问题,但我的情况非常开放.
希望如果我没有直接回答你的问题,你可以蚕食这个并让你到达你需要去的地方 - 但我刚刚实施了这一点,我的测试都已经过去了.
我猜测问题在于识别该属性是否可为空。在 C# 中,您可以使用以下代码执行此操作:
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
Run Code Online (Sandbox Code Playgroud)
...但我不确定 VB.NET 中最后一个子句的等效项是什么。
| 归档时间: |
|
| 查看次数: |
8120 次 |
| 最近记录: |