Перевод приложения C # WCF в Visual Basic - PullRequest
2 голосов
/ 15 октября 2010

Я пытаюсь написать простое / маленькое приложение-службу Windows Communication Foundation на Visual Basic (но я очень новичок в VB), и все хорошие примеры, которые я нашел в сети, написаны на C #.До сих пор у меня работало приложение-служба WCF, но теперь я пытаюсь добавить функцию обратного вызова, и программа стала более сложной.В коде примера C # я понимаю, как все работает, но у меня возникают проблемы с переводом в VB части кода, которая использует делегат.Кто-нибудь может показать VB-эквивалент?

Вот пример кода C #, который я использую для справки:

namespace WCFCallbacks
{
    using System;
    using System.ServiceModel;

    [ServiceContract(CallbackContract = typeof(IMessageCallback))]
    public interface IMessage
    {
        [OperationContract]
        void AddMessage(string message);

        [OperationContract]
        bool Subscribe();

        [OperationContract]
        bool Unsubscribe();
    }

    interface IMessageCallback
    {
        [OperationContract(IsOneWay = true)]
        void OnMessageAdded(string message, DateTime timestamp);
    }        
}

namespace WCFCallbacks
{
    using System;
    using System.Collections.Generic;
    using System.ServiceModel;

    public class MessageService : IMessage
    {
        private static readonly List<IMessageCallback> subscribers = new List<IMessageCallback>();

        //The code in this AddMessage method is what I'd like to see re-written in VB...
        public void AddMessage(string message)
        {

            subscribers.ForEach(delegate(IMessageCallback callback)
            {
                if (((ICommunicationObject)callback).State == CommunicationState.Opened)
                {
                    callback.OnMessageAdded(message, DateTime.Now);
                }
                else
                {
                    subscribers.Remove(callback);
                }
            });
        }

        public bool Subscribe()
        {
            try
            {
                IMessageCallback callback = OperationContext.Current.GetCallbackChannel<IMessageCallback>();
                if (!subscribers.Contains(callback))
                    subscribers.Add(callback);
                return true;
            }
            catch
            {
                return false;
            }
        }

        public bool Unsubscribe()
        {
            try
            {
                IMessageCallback callback = OperationContext.Current.GetCallbackChannel<IMessageCallback>();
                if (!subscribers.Contains(callback))
                    subscribers.Remove(callback);
                return true;
            }
            catch
            {
                return false;
            }
        }
    }        
}

Я думал, что смогу сделать что-то подобное, но я незнать, как передать строку сообщения от AddMessage до DoSomething ...

Dim subscribers As New List(Of IMessageCallback)

Public Sub AddMessage(ByVal message As String) Implements IMessage.AddMessage

    Dim action As Action(Of IMessageCallback)
    action = AddressOf DoSomething
subscribers.ForEach(action)

'Or this instead of the above three lines:
'subscribers.ForEach(AddressOf DoSomething)

End Sub

Public Sub DoSomething(ByVal callback As IMessageCallback)

    'I am also confused by:
    '((ICommunicationObject)callback).State
    'Is that casting the callback object as type ICommunicationObject? 
    'How is that done in VB?

End Sub

Ответы [ 3 ]

1 голос
/ 15 октября 2010

Онлайн-конвертер C # в VB здесь: http://www.developerfusion.com/tools/convert/csharp-to-vb/ успешно преобразует ваш код.

1 голос
/ 15 октября 2010

Я лично использую Telerik Converter - он может даже выполнять массовые преобразования для загруженных файлов.

1 голос
/ 15 октября 2010

То есть вы не знаете секретный конвертер ?

Public Class MessageService
    Implements IMessage
    Private Shared ReadOnly subscribers As New List(Of IMessageCallback)()

    'The code in this AddMessage method is what I'd like to see re-written in VB...
    Public Sub AddMessage(message As String)

        subscribers.ForEach(Function(callback As IMessageCallback) Do
            If DirectCast(callback, ICommunicationObject).State = CommunicationState.Opened Then
                callback.OnMessageAdded(message, DateTime.Now)
            Else
                subscribers.Remove(callback)
            End If
        End Function)
    End Sub

    Public Function Subscribe() As Boolean
        Try
            Dim callback As IMessageCallback = OperationContext.Current.GetCallbackChannel(Of IMessageCallback)()
            If Not subscribers.Contains(callback) Then
                subscribers.Add(callback)
            End If
            Return True
        Catch
            Return False
        End Try
    End Function

    Public Function Unsubscribe() As Boolean
        Try
            Dim callback As IMessageCallback = OperationContext.Current.GetCallbackChannel(Of IMessageCallback)()
            If Not subscribers.Contains(callback) Then
                subscribers.Remove(callback)
            End If
            Return True
        Catch
            Return False
        End Try
    End Function
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...