【问题标题】:Help Translating a small C# WCF app into Visual Basic (part 2)帮助将小型 C# WCF 应用程序翻译成 Visual Basic(第 2 部分)
【发布时间】:2010-10-18 17:46:36
【问题描述】:

我最近问了一个关于将我在 Internet 上找到的代码示例从 C# 转换为 VB 的问题,我得到了自动代码翻译网站的链接 (http://converter.telerik.com/ & http://www.developerfusion.com/tools/convert/csharp-to-vb/) .我对 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 代码来帮助我,我将不胜感激。 谢谢!

【问题讨论】:

  • 当你说“不起作用”时,它怎么不起作用?
  • 我在尝试编译代码时遇到了几个错误:Error 1 Expression expected。未声明错误 2“回调”。由于其保护级别,它可能无法访问。未声明错误 3“回调”。由于其保护级别,它可能无法访问。未声明错误 4“回调”。由于其保护级别,它可能无法访问。错误 5 应为“End Sub”。错误 6 预期语句结束。错误 7 'End Sub' 必须以匹配的 'Sub' 开头。
  • 我想知道 AddMessage 方法 VB 代码的问题是否在于关键字“Do”不应该存在。如果我删除“做”代码编译...
  • 另外,在这一行中:subscribers.ForEach(Function(callback As IMessageCallback) 似乎将“Function”更改为“Sub”效果更好。然后还将匹配的“Function End”替换为“Sub End" 向下几行。

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


【解决方案1】:

我不是一个 VB.NET 程序员,但我认为很明显 C# -> 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

【讨论】:

  • 感谢您的回答!我还发布了一个可行的替代版本。
【解决方案2】:

此代码有效:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多