簡體   English   中英

使用System.Type對象在運行時進行投射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM