我正在尝试在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
答案 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 - 它甚至可以对上传的文件进行批量转换。