vb.net класс upcasting / downcasting - PullRequest
       22

vb.net класс upcasting / downcasting

0 голосов
/ 08 ноября 2019

У меня проблема с приведением классов в vb.net, я использую Visual Studio 2008 с Compact Framework 3.5, так как работаю над устаревшим проектом Windows Mobile.

У меня есть 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(), но мне нужно иметь возможность добавлять методы и свойства для реализации бизнес-логики.

1 Ответ

1 голос
/ 08 ноября 2019

Внутри цикла For Each:

Для одного снимка:

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

Проблема в том, что вы не можете привести объект к его дочернему элементу (такая операция можетработать в другом направлении), это в принципе невозможная проблема. Тем не менее, вы можете обойти это путем некоторого клонирования. Это говорит мне, что базовые данные одинаковы для Customer и MyCustomer, вы только добавили больше методов. Это здорово, потому что это также означает, что вы можете вручную преобразовать клиента в MyCustomer. Вам просто нужно, чтобы это произошло автоматически.

В классы MyCustomers и MyCustomer вы можете добавить тезисы:

'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

Затем, если вы хотите работать со своими собственными объектами, вы можете экстраполировать их изте из dll:

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

Если вам часто нужен список MyCustomers и вас не волнует остальная часть класса, вы можете создать функцию Shared, которая даст вам только экстраполированный списокMyCustomer, без проблем.

Это работает только до тех пор, пока вы, конечно, можете экстраполировать MyCustomer от клиентов и MyCustomer от клиентов.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...