Я ищу попытку реализовать вспомогательный класс посредника, чтобы облегчить передачу информации между режимами просмотра.
Начиная со следующего в С#
static public class Mediator
{
static IDictionary<string, List<Action<object>>> pl_dict = new Dictionary<string, List<Action<object>>>();
static public void Register(string token, Action<object> callback)
{
if (!pl_dict.ContainsKey(token))
{
var list = new List<Action<object>>();
list.Add(callback);
pl_dict.Add(token, list);
}
else
{
bool found = false;
foreach (var item in pl_dict[token])
if (item.Method.ToString() == callback.Method.ToString())
found = true;
if (!found)
pl_dict[token].Add(callback);
}
}
static public void Unregister(string token, Action<object> callback)
{
if (pl_dict.ContainsKey(token))
pl_dict[token].Remove(callback);
}
static public void NotifyColleagues(string token, object args)
{
if (pl_dict.ContainsKey(token))
foreach (var callback in pl_dict[token])
callback(args);
}
}
В итоге я получаю следующее в vb (любезно предоставлено онлайн-конвертером telerik
Public NotInheritable Class Mediator
Private Sub New()
End Sub
Shared pl_dict As IDictionary(Of String, List(Of Action(Of Object))) = New Dictionary(Of String, List(Of Action(Of Object)))()
Public Shared Sub Register(token As String, callback As Action(Of Object))
If Not pl_dict.ContainsKey(token) Then
Dim list = New List(Of Action(Of Object))()
list.Add(callback)
pl_dict.Add(token, list)
Else
Dim found As Boolean = False
For Each item As var In pl_dict(token)
If item.Method.ToString() = callback.Method.ToString() Then
found = True
End If
Next
If Not found Then
pl_dict(token).Add(callback)
End If
End If
End Sub
Public Shared Sub Unregister(token As String, callback As Action(Of Object))
If pl_dict.ContainsKey(token) Then
pl_dict(token).Remove(callback)
End If
End Sub
Public Shared Sub NotifyColleagues(token As String, args As Object)
If pl_dict.ContainsKey(token) Then
For Each callback As var In pl_dict(token)
callback(args)
Next
End If
End Sub
End Class
Компилятору не нравятся два оператора For Each <...> As var. Я предполагаю, что это стиль linq С#, который всегда очень трудно перевести с легкостью. Это я, якобы, потому что я все еще пытаюсь понять весь принцип. Может ли кто-нибудь предложить правильную конструкцию для этих двух строк.
благодаря
В VB эквивалент var
состоит в том, чтобы просто объявить переменную без указания типа, например:
For Each callback In pl_dict(token)
callback(args)
Next
Однако для того, чтобы это сработало, вам нужно иметь Option Infer On
. В качестве альтернативы вы можете просто указать тип переменной итератора как бы то ни было (в данном случае Action(Of Object)
), например:
For Each callback As Action(Of Object) In pl_dict(token)
callback(args)
Next