【发布时间】: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