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