Передача списков из WCF в WCF в VB

#vb.net #wcf #list #for-loop #each

#vb.net #wcf #Список #цикл for #каждый

Вопрос:

Я пытаюсь заполнить один список из другого. Я бы подумал, что этот код должен сработать, но в конце дня я получаю список идентичных элементов.

 Public Sub WriteDatFile(ByRef lstReasons As System.Collections.Generic.List(Of LetterReason))
    Dim tmplstReason As New TCPService.LetterReason
    Dim tmplstReasons As New System.Collections.Generic.List(Of TCPService.LetterReason)


    'Load the letter reasons
    For Each LetterReason In lstReasons
        tmplstReason._reason = LetterReason.Reason
        tmplstReasons.Add(tmplstReason)
    Next

    RetVal = .......

End Sub
  

Теперь, когда я устанавливаю точку останова и проверяю из вызывающего WCF, я получаю это:

lstReason(0).Причина = Одна

lstReason(1).Причина = две

lstReason(2).Причина = Три

Но, когда я устанавливаю точку останова (после загрузки) в этой подпрограмме, я получаю следующий вывод:

tmplstReason(0)._reason = Три

tmplstReason(0)._reason = Три

tmplstReason(0)._reason = Три

Что происходит??? Есть идеи?

Спасибо, Джейсон

Ответ №1:

Вам нужно создать новый экземпляр LetterReason внутри цикла и добавить новый экземпляр в список. Попробуйте это

  For Each LetterReason In lstReasons
        Dim tmplstReason As New TCPService.LetterReason
        tmplstReason._reason = LetterReason.Reason
        tmplstReasons.Add(tmplstReason)
    Next
  

Ответ №2:

 tmplstReason._reason = LetterReason.Reason
tmplstReasons.Add(tmplstReason)
  

Посмотрите внимательно. На самом деле вы не меняете tmplstReason, вы меняете его свойство ._reason . Затем вы добавляете tmplstReason в список 3 раза.

В результате вы фактически каждый раз добавляете в список одно и то же и каждый раз изменяете переменную ._reason этого одного объекта. Поскольку все они одинаковы, все они имеют одинаковое значение. 🙂