繁体   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