[Last Call] Learn about multicloud storage options and how to improve your company's cloud strategy. Register Now

x
?
Solved

Custom CType Function That you define the "type" to convert to at runtime  -- Anyone have an any ideas

Posted on 2004-03-26
3
Medium Priority
?
842 Views
Last Modified: 2010-05-18
I have wrtten a working solution that converts a datarow to a class, so I can manipulate it with the least pain, as I have to do this quite a bit I've written a base class to handle this for me that leverages reflection so it will work for any new classes I build. The code is below.

Public Sub FillClassFromDataSet(ByVal ds As DataSet, ByVal ClassToFill As Object, ByVal ClassType As Type)
        'This function converts the information in a dataset to a class
        'note for this method to be usable the properties of the class must match the
        'column names in the dataset
        Dim dc As System.Data.DataColumn
        Dim dr As System.Data.DataRow
        Try
            'Get the data row to convert
            dr = ds.Tables(0).Rows(0)
            'For each column in our data row attempt to convert the value to class value
            For Each dc In ds.Tables(0).Columns
                'arglist is the object we use to pass the value to our class property
                Dim arglist(0) As Object
                'Get the system type of the class proeprty we are trying to convert to
                Dim PropertyInfo As System.Reflection.PropertyInfo = ClassType.GetProperty(dc.ColumnName)
                'Check to make sure we have a corresponding property in the class to
                'match our column name
                If Not PropertyInfo Is Nothing Then
                    'based on the proprety type perform the appropriate conversion on the
                    'value we want to pass to the class property
                    Select Case PropertyInfo.PropertyType.ToString
                        Case "System.String" : arglist(0) = CType(dr(dc.Ordinal), System.String)
                        Case "System.Int16" : arglist(0) = CType(dr(dc.Ordinal), System.Int16)
                        Case "System.Int32" : arglist(0) = CType(dr(dc.Ordinal), System.Int32)
                        Case "System.Int64" : arglist(0) = CType(dr(dc.Ordinal), System.Int64)
                        Case "System.DateTime" : arglist(0) = CType(dr(dc.Ordinal), System.DateTime)
                        Case "System.Double" : arglist(0) = CType(dr(dc.Ordinal), System.Double)
                        Case "System.Decimal" : arglist(0) = CType(dr(dc.Ordinal), System.Decimal)
                        Case "System.Decimal" : arglist(0) = CType(dr(dc.Ordinal), System.Decimal)
                        Case Else
                            'An handled type    
                            Throw New System.Exception("Unhandled Property Type (" & PropertyInfo.PropertyType.ToString & ") in FillClassFormDataSet")
                    End Select
                    Try
                        'Now pass the value from the datacolumn to the correspoding class proprety
                        ClassType.InvokeMember(dc.ColumnName, Reflection.BindingFlags.SetProperty, Nothing, ClassToFill, arglist)
                    Catch ex As Exception
                        Dim x As String = ex.Message
                    End Try
                Else
                    Throw New System.Exception("Unknown Property (" & dc.ColumnName & ") in FillClassFormDataSet")
                End If
            Next
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try

    End Sub

This code is ok but it only handles conversions for the types that I have defined in the class, int32, string and so on.

The problem is this I'd like to replace the whole select statement that gets the type of the property and does the appropriate conversion with the following lines

Dim PropertyType As Type = PropertyInfo.PropertyType
CType(dr(dc.Ordinal), PropertyType)

This way I could handle any/all types that could be safely stored in a db and won't have to worry about constantly updating my class

Of course the Ctype function only excepts system defined types and won't except my variable pointing to the type I'd like it converted to :(

Anyone know a way to get around this behaviour, I checked out the basetype for Ctype but it looks like evetually I'm still going to have the same problem and be back to my original verbose solution. Any ideas, help would be appreciated





0
Comment
Question by:NotaClue
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
3 Comments
 
LVL 6

Accepted Solution

by:
KarunSK earned 1500 total points
ID: 10689735
You can replace the Select Case construct with this line:

                    arglist(0) = Convert.ChangeType(dr(dc.Ordinal), PropertyInfo.PropertyType)

HTH,
Karun.
0
 
LVL 1

Author Comment

by:NotaClue
ID: 10689865
Thanks Karen,

Exactly want I needed
0
 
LVL 6

Expert Comment

by:KarunSK
ID: 10689991
Can you tell me why this question has been rated "B"?
0

Featured Post

Veeam Task Manager for Hyper-V

Task Manager for Hyper-V provides critical information that allows you to monitor Hyper-V performance by displaying real-time views of CPU and memory at the individual VM-level, so you can quickly identify which VMs are using host resources.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In my previous article (http://www.experts-exchange.com/Programming/Languages/.NET/.NET_Framework_3.x/A_4362-Serialization-in-NET-1.html) we saw the basics of serialization and how types/objects can be serialized to Binary format. In this blog we wi…
A long time ago (May 2011), I have written an article showing you how to create a DLL using Visual Studio 2005 to be hosted in SQL Server 2005. That was valid at that time and it is still valid if you are still using these versions. You can still re…
This course is ideal for IT System Administrators working with VMware vSphere and its associated products in their company infrastructure. This course teaches you how to install and maintain this virtualization technology to store data, prevent vuln…
This tutorial will teach you the special effect of super speed similar to the fictional character Wally West aka "The Flash" After Shake : http://www.videocopilot.net/presets/after_shake/ All lightning effects with instructions : http://www.mediaf…

656 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question