1

这样的事情可能吗 - 如果是这样的话怎么办?

    Public Sub CreateGenericList(ByVal SampleObject As Object)
        Dim genericList as new List(Of SampleObject.GetType())
    End Function

我想创建一个能够反序列化给定 XML 文件的类。XML 文件包含自定义类型的序列化值,这在编译时是未知的。我认为可以只使用参数 SampleObject 初始化类,然后获取 SampleObject 的类型以进行所有进一步的处理。但似乎所有操作的类型都必须在编译时知道?有没有办法解决它或者你能向我解释这个问题吗?

上面的代码示例只是为了说明我的问题

感谢您的帮助,贾尼斯

编辑:您的答案可能已经解决了问题,我将阅读更多关于“反思”和“泛型”主题的内容,如果我取得任何进展,我会及时通知您。所以感谢分配的帮助。

对于那些仍然感兴趣的人:我被问到我的问题的目的,并将尽我所能解释它。

    Public Function ReadAllObjects() As List(Of myObjectType)
        Dim result As New List(Of myObjectType)
        Dim ObjectSerializer As New System.Xml.Serialization.XmlSerializer(result.GetType)
        Dim FileReader As New System.IO.FileStream(My.Settings.XMLPath, System.IO.FileMode.Open)
        result = TryCast(ObjectSerializer.Deserialize(FileReader), List(Of myObjectType))
        FileReader.Close()
        RaiseEvent ReadingFinished()
        Return result
    End Function

这几乎总结了我想要创建的内容:一个 EasyXmlHandling.dll 供进一步使用,它将使用当前使用的变量类型进行初始化。然后它应该能够以非常简单的方式写入和读取 XML 文件,只需调用“ReadAllObjects”(返回 myObjectType 的列表)或“AddObject(ByVal theNewObject)”......(更多职能)

我得到了所有这些都可以使用自定义类作为类型,所以我现在可以轻松地重用 EasyXmlHandling 代码,只需将源代码中的类型替换为我想要使用的任何新类。虽然我更愿意只用一个示例对象(或它的类型)调用 .dll 并让它自动执行其他所有操作。

我希望这是可以理解的,但我的英语和技术词汇都不是很好;)

因此,再次感谢您的帮助和阅读本文。我将尝试让它与您之前的所有答案一起使用,并在我取得进一步进展时更新主题。

4

1 回答 1

1

不,这是不可能的(至少,不使用反射是不可能的)。在泛型列表或任何其他泛型类型中指定类型的全部意义在于,编译器可以执行编译时类型检查。如果您没有在编译时指定类型,那么它根本没有任何好处。除了没有任何好处之外,它也根本不受支持。如果您在编译时不知道类型,则应Object改为使用,因为它适用于任何类型的对象,例如:

Dim myList As New List(Of Object)()

但是,如果您需要一个仅允许一种类型的项目的列表,但该类型在编译时是未知的,则可以这样做,但您可能需要为类似的东西创建自己的非泛型列表类。据我所知,框架中没有提供将其项目限制为单个指定类型的非泛型列表类。

更新

现在您已经解释了这样做的原因,很明显泛型是您的解决方案。例如,您可以将其实现为通用函数,如下所示:

Public Function ReadAllObjects(Of T)() As List(Of T)
    Dim result As New List(Of T)
    Dim ObjectSerializer As New System.Xml.Serialization.XmlSerializer(result.GetType)
    Dim FileReader As New System.IO.FileStream(My.Settings.XMLPath, System.IO.FileMode.Open)
    result = TryCast(ObjectSerializer.Deserialize(FileReader), List(Of T))
    FileReader.Close()
    RaiseEvent ReadingFinished()
    Return result
End Function

然后,您可以像这样调用它,将它传递给您想要的任何类型:

Dim cars As New List(Of Car) = ReadAllObjects(Of Car)()
Dim boats As New List(Of Boat) = ReadAllObjects(Of Boat)()

如您所见,这就是泛型的全部目的。当您保持代码类型特定时,它们是一个非常强大的工具,但仍然可以在不同类型中重复使用它。另一方面,反射并不适合这种特殊情况。反射也非常有用,但应始终将其视为最后的选择。如果有另一种方法可以做到这一点,而无需反思,那通常是更好的方法。

于 2013-08-12T11:25:30.660 回答