1

I'm looking at trying to implement a mediator helper class to facilitate the transfer of information between viewmodels.

Starting with the following in c#

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); 
    } 
} 

I end up with the following in vb (courtesy of telerik's online converter

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

The compiler doesn't like the two For Each <...> As var statements. I'm assuming that this is linq c# style which has always been very difficult to translate with ease. This one has me ostensibly because I'm still trying to fathom out the whole principle anyway. Can anyone suggest a proper construct for the two lines in question.

Thanks

Dom Sinclair
  • 2,458
  • 1
  • 30
  • 47

1 Answers1

2

In VB, the equivalent of var is to simply declare the variable without specifying the type, for instance:

For Each callback In pl_dict(token)
    callback(args)
Next

However, in order for that to work, you need to have Option Infer On. Alternatively, you could just specify the type of the iterator variable as whatever it actually is (in this case, Action(Of Object)), like this:

For Each callback As Action(Of Object) In pl_dict(token)
    callback(args)
Next
Steven Doggart
  • 43,358
  • 8
  • 68
  • 105