使用 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。

如有任何帮助,我们将不胜感激!

p.s。我已经试过了:

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

这允许该字段也可以为空!