简体   繁体   中英

Passing the type of the property to generic function

I am reading a text file, translate the data where each line either goes in header object or items object. I am having an issue with nullables

'p' in below code is coming from

Dim properties As PropertyInfo() = GetType(UploadMain).GetProperties()

The code below throws the error:

Invalid cast from 'System.DateTime' to 'System.Nullable`1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'

p.SetValue(header, Convert.ChangeType(dataObject, p.PropertyType))

the corresponding property in the class

private _orderDate As Date?
        Public Property OrderDate As Date?
            Get 
                Return _orderDate
            End Get
            Set(value As Date?)
                _orderDate = value
            End Set
        End Property

After looking around, found the following function, which i translated from C#

Public Class ChangeTypeUtlity

        Public Shared Function ChangeType(Of T)(ByVal value As Object) As T
            Dim conversionType As Type = GetType(T)

            If conversionType.IsGenericType AndAlso conversionType.GetGenericTypeDefinition().Equals(GetType(Nullable)) Then

                If value Is Nothing Then
                    Return Nothing
                Else
                    Dim nullableConverter As NullableConverter = New NullableConverter(conversionType)
                    conversionType = nullableConverter.UnderlyingType
                End If
            End If

            Return CType(Convert.ChangeType(value, conversionType), T)
        End Function

    End Class

I have tried it with both type1 and type2 but getting error that it is not defined.

Dim type1 as Type = p.[GetType]()
Dim type2 As Type = p.PropertyType
p.SetValue(header, ChangeTypeUtlity.ChangeType(Of type2)(dataObject))

How can i pass my property type to the above function?

You can give the solution in C#. It doesn't need to be VB.Net

Your problem is with ChangeType, do you even need it? If you do, detect if the property is Nullable, if it is you can then use GetUnderlyingType

Convert.ChangeType(dataObject, Nullable.GetUnderlyingType(p.PropertyType))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM