我最近提出了一个问题,即将我在互联网上找到的代码示例从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代码来帮助我,我将非常感激。 谢谢!
答案 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