对象的动态赋值
最近在做项目中做了个动态给对象赋值的功能,这样就避免了每个对象的属性都要一一复制。
原理很简单,传一个DATAREADER,根据字段名称,取类的属性,若存在则将字段值赋值与它。
以下贴上代码,如有不妥,欢迎大家指正,或给出更好的建议。
’对象集合赋值
Public Shared Function getListFromDatareader(ByVal list As Object, ByVal Model As Object, ByVal rdr As SqlDataReader) As Object
While rdr.Read
‘System.Activator.CreateInstance(Model.GetType),--实例化一个新对象
list.Add(getModelFromDatareader(System.Activator.CreateInstance(Model.GetType), rdr))
End While
Return list
rdr.Close()
End Function
‘单个对象赋值
Public Shared Function getModelFromDatareader(ByVal Model As Object, ByVal rdr As SqlDataReader) As Object
For i = 0 To rdr.FieldCount - 1
Dim mProperty = Model.GetType.GetProperty(rdr.GetName(i))‘取当前类的和本字段名的属性
’若属性存在,则将本字段的值赋值与它
If Not IsNothing(mProperty) Then
Select Case mProperty.PropertyType.Name.ToString
Case "String"
mProperty.SetValue(Model, rdr.Item(mProperty.Name.ToString).ToString, Nothing)
Case "Byte", "Int32"
mProperty.SetValue(Model, CInt(rdr.Item(mProperty.Name.ToString).ToString), Nothing)
'objvalue = Int(rdr.Item(p.Name.ToString).ToString)
Case "Decimal", "Double"
mProperty.SetValue(Model, Decimal.ToDouble(rdr.Item(mProperty.Name.ToString)), Nothing)
End Select
End If
Next
Return Model
End Function
Public Shared Function getListFromDatareader(ByVal list As Object, ByVal Model As Object, ByVal rdr As SqlDataReader) As Object
While rdr.Read
‘System.Activator.CreateInstance(Model.GetType),--实例化一个新对象
list.Add(getModelFromDatareader(System.Activator.CreateInstance(Model.GetType), rdr))
End While
Return list
rdr.Close()
End Function
‘单个对象赋值
Public Shared Function getModelFromDatareader(ByVal Model As Object, ByVal rdr As SqlDataReader) As Object
For i = 0 To rdr.FieldCount - 1
Dim mProperty = Model.GetType.GetProperty(rdr.GetName(i))‘取当前类的和本字段名的属性
’若属性存在,则将本字段的值赋值与它
If Not IsNothing(mProperty) Then
Select Case mProperty.PropertyType.Name.ToString
Case "String"
mProperty.SetValue(Model, rdr.Item(mProperty.Name.ToString).ToString, Nothing)
Case "Byte", "Int32"
mProperty.SetValue(Model, CInt(rdr.Item(mProperty.Name.ToString).ToString), Nothing)
'objvalue = Int(rdr.Item(p.Name.ToString).ToString)
Case "Decimal", "Double"
mProperty.SetValue(Model, Decimal.ToDouble(rdr.Item(mProperty.Name.ToString)), Nothing)
End Select
End If
Next
Return Model
End Function