【发布时间】: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