【问题标题】:cast to generic type at runtime在运行时转换为泛型类型
【发布时间】:2010-09-11 18:08:08
【问题描述】:

好的,我不认为这是可能的,所以我想我会要求确定。我正在创建一个函数,它反映类中的属性并将它们添加到我拥有的这个数据结构中。一些属性是泛型类型。

假设我们有一个DataType(Of T) 有一个.Value 类型为T 的属性:

Dim properties = GetType(MyType).GetFields(Reflection.BindingFlags.Public Or _
                                           Reflection.BindingFlags.Instance)
For Each prop As fieldinfo In properties
   Collection.Add(prop.Name,prop.GetValue(poco))
Next

在基本类型的collection.Add 中(IntegerString 等...)我只想添加类型...但对于泛型我想添加DataType(Of T).Value。我希望有一些解决方法,但我认为没有办法,因为 T 的类型无法在编译时确定,对吧?理想情况下,DirectCast(prop.getvalue(poco), DataType(Of T)).Value 是可能的。这是您希望出现比 .NET 4.0 中更多动态的时候。

【问题讨论】:

标签: vb.net generics reflection


【解决方案1】:

我突然想到我可能误读了您的问题。因此,我的另一个答案。

通过引入允许访问某些Value 属性的新接口,您可以避免在运行时强制转换为泛型类型(您不知道类型参数):

Public Interface IHasValue
    Public ReadOnly Property Value As Object
End Interface

接下来,确保您的DataType(Of T) 类实现了这个接口。这意味着每个DataType(Of T) 对象(无论T 是什么具体类型)也是IHasValue,您可以使用TypeOf(…) Is IHasValue 进行检查:

Public Class DataType(Of T) : Implements IHasValue

    Public Value As T

    Public ReadOnly Property UntypedValue As Object Implements IHasValue.Value
        Get
            Return Me.Value
        End Get
    End Property

End Class

Value 的这种重复是必要的,原因有两个:首先,当DataType(Of T).Value 是字段而不是属性时,这是必要的,其次是因为它们的类型不同。)

然后,在您用字段填充集合的地方,您可以通过执行以下操作来检查特定字段是否为 DataType(Of T)(如果是,请从中解开 Value):

Dim value As Object = prop.GetValue(poco)

If TypeOf(value) Is IHasValue Then         ' <- is value a DataType(Of T) ?    '
    value = CType(value, IHasValue).Value  ' <- if so, unwrap the value        '
End If

Collection.Add(prop.Name, value)

这可能比我的其他答案更符合您的要求,但让我强调一下:

If TypeOf(…) Is … Then … 是代码异味。也许您应该重新考虑您的代码并研究涉及多态性的解决方案。

【讨论】:

  • 非常感谢 stakx 的帮助。优秀的解决方案。是的,更好的解决方案是返回一个基本类型,只调用它 BasicType 并返回它而不是类型 T。BasicType 只会保存类型 T,但在这种情况下你不必担心强制转换。不幸的是,这需要大量的代码重新访问,因为这个东西被全部使用并且很少有人使用这个接口。无论如何,非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
相关资源
最近更新 更多