Return to Snippet

Revision: 27808
at June 24, 2010 05:04 by s0lidmetal

Initial Code
<System.Runtime.CompilerServices.Extension()> _
        Public Sub AssignObjectValue(ByVal dr As DataRow, ByVal target As Object)
            For Each dc As DataColumn In dr.Table.Columns
                Dim colName As String = dc.ColumnName
                Dim colValue As Object = dr(colName)

                If colValue Is DBNull.Value Then
                    colValue = Nothing
                End If

                Dim pi As PropertyInfo = target.GetType().GetProperty(colName)
                If pi IsNot Nothing AndAlso colValue IsNot Nothing Then
                    Dim propType As Type = Nothing
                    Dim nullableType As Type = Nullable.GetUnderlyingType(pi.PropertyType)

                    If nullableType IsNot Nothing Then
                        propType = nullableType
                        propType = pi.PropertyType
                    End If

                    If propType Is colValue.GetType() Then
                        pi.SetValue(target, colValue, Nothing)
                    End If
                End If
        End Sub

Initial URL

Initial Description
This will populate object properties with values from a DataRow. The DataTable column names must match the property names and types of the target class.


    DataTable dt = new DataTable();
    dt.Columns.Add("TestString", typeof(string));
    dt.Columns.Add("TestBool", typeof(bool));
    dt.Columns.Add("TestInt", typeof(int));
    dt.Columns.Add("TestDouble", typeof(double));
    dt.Columns.Add("TestDecimal", typeof(decimal));
    dt.Columns.Add("TestFloat", typeof(string));

    DataRow dr = dt.NewRow();
    dr["TestString"] = "Hello";
    dr["TestBool"] = false;
    dr["TestInt"] = DBNull.Value;
    dr["TestDouble"] =4.56;
    dr["TestDecimal"] = 7.89m;
    dr["TestFloat"] = "3.14f";

    TestClass tc = new TestClass();
    class TestClass
        public string TestString { get; set; }
        public bool? TestBool { get; set; }
        public int? TestInt { get; set; }
        public double TestDouble { get; set; }
        public decimal TestDecimal { get; set; }
        public float TestFloat { get; set; }

Initial Title
Reflection extension method to bind DataRow values to object properties.

Initial Tags

Initial Language
Visual Basic