帮助将小型C#WCF应用程序翻译成Visual Basic(第2部分)

时间:2010-10-18 17:46:37

标签: c# vb.net wcf delegates c#-to-vb.net

我最近提出了一个问题,即将我在互联网上找到的代码示例从C#转换为VB,并且我获得了自动代码转换网站的链接(http://converter.telerik.com/& {{3 }})。我是VB的新手,不幸的是,转换器返回的VB无法在Visual Studio 2010中编译。我希望有人可以帮我修复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>();

        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;
            }
        }
    }
}

上面列出的两个转换器都返回相同的VB代码。 VB代码中不起作用的部分在AddMessage方法中。这是翻译生成的VB代码:

Imports System.ServiceModel

Namespace WCFCallbacks

    <ServiceContract(CallbackContract:=GetType(IMessageCallback))> _
    Public Interface IMessage
        <OperationContract()> _
        Sub AddMessage(ByVal message As String)

        <OperationContract()> _
        Function Subscribe() As Boolean

        <OperationContract()> _
        Function Unsubscribe() As Boolean
    End Interface

    Interface IMessageCallback
        <OperationContract(IsOneWay:=True)> _
        Sub OnMessageAdded(ByVal message As String, ByVal timestamp As DateTime)
    End Interface

End Namespace

Imports System
Imports System.Collections.Generic
Imports System.ServiceModel

Namespace WCFCallbacks

    Public Class MessageService
        Implements IMessage

        Private Shared ReadOnly subscribers As New List(Of IMessageCallback)()

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

   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 Implements IMessage.Subscribe
            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 Implements IMessage.Unsubscribe
            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

End Namespace

如果有人可以通过修复AddMessage方法的VB代码来帮助我,我将非常感激。 谢谢!

2 个答案:

答案 0 :(得分:1)

我不是一个VB.NET程序员,但我认为很明显C# - &gt; VB.NET解析器无法处理该委托技巧。如果你用委托删除那层复杂性,那么代码中发生的事情实际上是非常基本的(只有当你完全理解它时才会看起来很简单)。最后,C#代码只是通过订阅者列表并调用它们。使用委托的原因可能是能够从与迭代的集合中删除相同的集合而不必将它们保存在另一个构造中。

在这里,我只是将要删除的订阅者添加到另一个列表中,然后循环删除从原始列表中删除的订阅者(未测试):

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

        Dim removedSubscribers As New List(Of IMessageCallback)()

        For Each msgCallback In subscribers
            If (CType(msgCallback, ICommunicationObject).State = CommunicationState.Opened) Then
                msgCallback.OnMessageAdded(message, DateTime.Now)
            Else
                removedSubscribers.Add(msgCallback)
            End If
        Next

        For Each msgCallback In removedSubscribers
            subscribers.Remove(msgCallback)
        Next
    End Sub

答案 1 :(得分:1)

此代码有效:

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

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