Делегаты в VB - как из C #? - PullRequest
       27

Делегаты в VB - как из C #?

1 голос
/ 23 февраля 2010

Я застрял при преобразовании этого кода C # в VB:

AsyncHelpers.Async.Do(delegate { WriteStuff("additional stuff..."); });

Я думал, что это будет что-то вроде

AsyncHelpers.Async.Do(Function() WriteStuff("additional stuff...")

но я получаю ошибку "Выражение не дает значения".

Может кто-нибудь дать мне соответствующий перевод VB.Net?

Спасибо.

========== UPDATE

.
. 
. 

             Async.Do(New DlgR(AddressOf WriteStuff))


        End Sub

        Friend Shared Sub WriteStuff(ByVal thisStr As String)
            'do stuff with thisStr

        End Sub

Основываясь на предложении Брайана ниже, это все еще не работает.

Как получить параметр, переданный в WriteStuff?

Наконец, я также получаю ошибку совместимости подписи с делегированной функцией DlgR () в качестве объекта.

Ответы [ 2 ]

1 голос
/ 23 февраля 2010

VB.Net не очень хорошо справляется с поддержкой лямбда-выражений (см. Использование лямбда-выражений в ASP.NET MVC View с использованием VB.NET ).

Вы можете попробовать что-то вроде этого ...

Sub Main()
    Async.Do(New DlgR(AddressOf WriteStuff))
End Sub
Public Function WriteStuff(ByVal msg As String) As Object
    Console.WriteLine(msg)
    Return Nothing
End Function

Исходя из вашего кода, я предполагаю, что вы следовали статье CodeProject, На пути к более чистому коду, асинхронному помощнику C # , поэтому я использовал имя и подпись делегата из этого примера. Если вы используете другую библиотеку, имя и подпись делегата могут отличаться.

ОБНОВЛЕНИЕ: VB.Net не поддерживает замыкания (за дополнительной информацией обращайтесь к http://msmvps.com/blogs/bill/archive/2006/04/05/89370.aspx), поэтому, насколько я могу судить, вы не можете передать параметры методу. Самый простой способ сделать это - создать свой собственный класс замыкания и назвать его так ...

Module Module1
    Sub Main()
        Dim c1 = New MyClosure("Hello World")
        Dim c2 = New MyClosure("Test 123")
        CodeToast.Async.Do(New Dlg(AddressOf c1.WriteStuff))
        CodeToast.Async.Do(New Dlg(AddressOf c2.WriteStuff))
        Console.ReadKey()
    End Sub
End Module
Public Class MyClosure
    Public Sub New(ByVal msg As String)
        Message = msg
    End Sub
    Public Message As String
    Public Sub WriteStuff()
        Console.WriteLine(Message)
    End Sub
End Class
0 голосов
/ 23 февраля 2010

Наконец-то дошли до решения этой проблемы, в «более чем одной строке» она находится в C # ...

Я объявил своего делегата на уровне класса:

Public Delegate Sub loggerDelegate(ByVal a As LogEntry)

Затем внутри моего метода я выполняю асинхронный вызов журнала

.
    ' make the async logging call
    Dim myDel As loggerDelegate = New loggerDelegate(AddressOf Logger.Write)
    myDel(logEntry)

Полагаю, мне следовало бы назвать это "Асинхронное ведение журнала с MS Enterprise Library без MSMQ, но вы получите дрейф"

Надеюсь, это поможет кому-то еще.

...