[英]Casting at runtime using a System.Type object
我正在嘗試創建一個使用DataRow並用數據填充對象的函數。
這是我的代碼:
Public Shared Sub PopulateObjectFromDatarow(ByVal obj As Object, ByVal drwRow As DataRow)
Dim lstFields = obj.GetType() _
.GetFields(BindingFlags.Instance Or BindingFlags.Public) _
.ToList()
For Each field As FieldInfo In lstFields
If drwRow.Table.Columns.Contains(field.Name) Then
field.SetValue(obj, drwRow.Field(Of Object)(field.Name))
End If
Next
End Sub
基本上是將列名與屬性名匹配,並設置對象的屬性值。 直到我擊中枚舉類型,此方法才有效!
我將一個整數存儲在數據庫中以獲取枚舉值,並且我需要能夠將其轉換回枚舉值。
值得一提的是,我也在使用.Net3.5。
任何幫助將不勝感激!
ps我已經嘗試過了:
field.SetValue(obj, Convert.ChangeType(drwRow.Item(field.Name), field.FieldType))
無濟於事...
經過TnTinMin和Plutonix的評論后,這就是解決方案!
Public Shared Sub PopulateObjectFromDatarow(ByVal obj As Object, ByVal drwRow As DataRow)
Dim lstFields = obj.GetType() _
.GetFields(BindingFlags.Instance Or BindingFlags.Public) _
.ToList()
For Each field As FieldInfo In lstFields
If drwRow.Table.Columns.Contains(field.Name) Then
If field.FieldType Is GetType(String) Then
field.SetValue(obj, HttpUtility.HtmlDecode(drwRow.Field(Of String)(field.Name)))
ElseIf field.FieldType.IsGenericType Then
If drwRow.Field(Of Object)(field.Name) Is Nothing Then
field.SetValue(obj, Nothing)
Else
If field.FieldType.GetGenericArguments()(0).IsEnum Then
field.SetValue(obj, [Enum].Parse(field.FieldType.GetGenericArguments()(0), drwRow.Field(Of Integer)(field.Name).ToString()))
Else
field.SetValue(obj, drwRow.Field(Of Object)(field.Name))
End If
End If
Else
If field.FieldType.IsEnum Then
field.SetValue(obj, [Enum].Parse(field.FieldType, drwRow.Field(Of Integer)(field.Name).ToString()))
Else
field.SetValue(obj, drwRow.Field(Of Object)(field.Name))
End If
End If
End If
Next
End Sub
這允許該字段也可以為空的事實!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.