vb.net class 向上转型/向下转型

vb.net class upcasting / downcasting

我在 vb.net 中转换 类 时遇到问题,我正在使用 Visual Studio 2008 和 Compact Framework 3.5,因为我正在处理遗留 Windows 移动项目。

我有一个 DLL,它充当访问 SqlCe 中数据库对象的数据层,我无法更改其中的任何代码,但是我想为业务公开的 类 添加额外的功能逻辑,所以我创建了自己的 类 并从数据层 类 继承了 类

Public Partial Class Customers
    Public Function ListAll() As IEnumerable(Of Customers)
        'Do Work
    End Function
End Class

Public Class MyCustomers
    Inherits Customers

    Public Function FindCustomer(ID As Integer)
    End Function
End Class

所以在我的代码中我会写类似

的东西
For Each c As MyCustomer In Customers.ListAll
    'I want to be able to use my c.FindCustomer(), but I get an InvalidCast Exception above.
Next

我知道这是向上转型/向下转型的问题(我不记得哪种方式),但我该如何解决?

我无法更改 Customers.ListAll() 的 return 类型,但我需要能够添加方法和属性来实现业务逻辑。

For Each 循环内:

对于 one-shot:

DirectCast(c, MyCustomer).FindCustomer(1) 'for id 1

要多次使用:

Dim customer as MyCustomer = DirectCast(c, MyCustomer)
customer.FindCustomer(1)

您还可以这样做:

With DirectCast(c, MyCustomer)
    .FindCustomer(1)
    .AnotherMethod()
    'etc
End With

玩得开心!


这是一个替代方案。我不确定你的项目的确切架构,所以我假设它是这样的:

Customers      -has a list of Customer
MyCustomers    -child of Customers with a list of MyCustomer and more functionalities

Customer       -base entry
MyCustomer     -base entry with more functionalities

问题是你不能将object转换成child(这种操作只能反方向),这基本上是一个不可能的问题。然而,您可以通过一些克隆来绕过它。这告诉我 CustomerMyCustomer 的基础数据是相同的,您只是添加了更多方法。这很棒,因为这也意味着您可以手动将 Customer 转换为 MyCustomer。你只需要它自动发生。

在 MyCustomers 和 MyCustomer class 中,您可以添加以下内容:

'In MyCustomers
Public Shared Function GetMyCustomersFromCustomers(customers As Customers) As MyCustomers
    Dim data As New MyCustomers()
    'copy each modal variable

    'create a list of MyCustomer from existing Customer list
    For Each c As Customer In customers.listOfCustomers
            data.listOfMyCustomers.Add(MyCustomer.GetMyCustomerFromCustomer(c))
    Next

    Return data
End Function

'In MyCustomer
Public Shared Function GetMyCustomerFromCustomer(customer As Customer) As MyCustomer
    Dim data As New MyCustomer

    'copy all the data

    Return data
End Function

然后,如果您想使用自己的 objects,您可以从 dll 中推断它们:

'let's say you currently have a 'customers' as Customers object
Dim myStuff as MyCustomers = MyCustomers.GetMyCustomersFromCustomers(customers)

如果您经常需要 MyCustomers 列表并且不关心 class 的其余部分,您可以创建一个 Shared 函数,它只为您提供 MyCustomer 的外推列表,没问题.

当然,这只有在您可以从 Customers 推断 MyCustomer 和从 Customer 推断 MyCustomer 时才有效。

希望对您有所帮助。