【问题标题】:Passing the type of the property to generic function将属性的类型传递给泛型函数
【发布时间】:2018-11-13 20:46:11
【问题描述】:

我正在阅读一个文本文件,翻译每行进入标题对象或项目对象的数据。我遇到了 nullables 的问题

下面代码中的'p'来自

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

下面的代码抛出错误:

从 'System.DateTime' 到 'System.Nullable`1 的无效转换[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'

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

类中对应的属性

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

看了一圈,发现下面这个函数,是我从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

我在 type1 和 type2 上都试过了,但得到了错误,它没有定义。

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

如何将我的属性类型传递给上述函数?

您可以在 C# 中给出解决方案。不需要是VB.Net

【问题讨论】:

  • 你的问题是ChangeType,你还需要它吗?如果这样做,请检测属性是否为 Nullable,如果是,则可以使用 Convert.ChangeType(dataObject, Nullable.GetUnderlyingType(p.PropertyType))
  • 我自己也一直在问同样的问题并进行了调查。从学习的角度来看,还是想知道如何传递属性类型。
  • @the_lotus 请将您的评论作为答案,以便我接受。 Convert.ChangeType(dataObject, Nullable.GetUnderlyingType(p.PropertyType)) 帮助解决了这个问题。我需要使用可为空的属性加上其他一些奇怪的数据,以及整数作为十进制传递。这是一个供应商文件,我无法控制它。
  • ChangeType 即使对于 C# 也是无关的。 the_lotus 中的行与我在 C# 模块中用于相同目的的代码基本相同。
  • @learning...我很高兴它有所帮助。我不知道如何正确写出答案,但我复制/粘贴了我的评论。

标签: c# vb.net system.reflection


【解决方案1】:

您的问题在于 ChangeType,您甚至需要它吗?如果这样做,请检测该属性是否为 Nullable,如果是,则可以使用 GetUnderlyingType

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多