将C#WCF应用程序转换为Visual Basic

时间:2010-10-15 17:55:21

标签: c# vb.net wcf delegates

我正在尝试在Visual Basic中编写一个简单/小型Windows Communication Foundation服务应用程序(但我在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 个答案:

答案 0 :(得分:1)

所以你不知道secret converter

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

答案 1 :(得分:1)

此处的在线C#到VB转换工具:http://www.developerfusion.com/tools/convert/csharp-to-vb/成功转换代码。

答案 2 :(得分:1)

我个人使用Telerik Converter - 它甚至可以对上传的文件进行批量转换。