【问题标题】:Casting at runtime using a System.Type object使用 System.Type 对象在运行时进行强制转换
【发布时间】:2015-10-23 10:01:33
【问题描述】:

我正在尝试创建一个函数,该函数接受一个 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

它基本上是将列名与属性名匹配,并设置对象的属性值。在我遇到 Enum 类型之前,这很有效!

我在数据库中为枚举值存储了一个整数,我需要能够将它转换回枚举值。

值得一提的是,我也在使用 .Net3.5。

任何帮助将不胜感激!

附言我已经试过了:

field.SetValue(obj, Convert.ChangeType(drwRow.Item(field.Name), field.FieldType))

无济于事...

【问题讨论】:

  • 你必须专门针对 Enums 进行测试;它们反映为 System,RuntimeType,使用 GetType.BaseType.UnderlyingSystemType 将是 System.Enum。但我不得不说,你可以通过使用类型化对象来避免这一切;如果数据可能来自多个类型,您可以存储一个代码来了解读取了哪个类型。
  • 我遇到的问题是我必须在 switch 语句中对所有可能的枚举类型进行硬编码,这就是我想要避免的。我正在追求一个甚至可以在其他项目中使用的功能。关于如何测试的好提示是它是一个枚举,我会看看我能用它做什么
  • 要将整数转换回枚举,请使用 '[Enum].Parse(EnumType, IntegerAsString)`。
  • 谢谢 TnTinMn,我会在星期一试一试!我似乎记得以前使用过类似的东西,应该已经意识到了!
  • 你们两个提供的两个 cmets 都非常有用!我结合使用两者来提出我需要的解决方案。在我的回答中获得认可:)

标签: vb.net casting type-conversion runtime


【解决方案1】:

在 TnTinMin 和 Plutonix 的 cmets 之后,这就是解决方案!

    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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2011-03-31
    • 2014-03-07
    • 1970-01-01
    相关资源
    最近更新 更多