DEV Community

Bruce Axtens
Bruce Axtens

Posted on

Converting C# to VB.Net - Need some help

using System;
using System.Collections.Generic;

namespace PreHOPL
{
    static class Program
    {
        private static readonly Dictionary<string, Tuple<int, Delegate>> dict = new Dictionary<string, Tuple<int, Delegate>>()
        {
            ["SAYLIT"] = new Tuple<int, Delegate>(1, (Action<string>)System.Console.WriteLine),
        };

        private static void Main(string[] args)
        {
            dict["SAYLIT"].Item2.DynamicInvoke("Hello World!");
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

I've just tried 4 diferent online tools (Telerik, ICSharpCode, Carlosag and DeveloperFusion) to convert this to VB.Net for a colleague. Three have spat a long error message and the fourth is spinning its wheels going nowhere. Ideas?

Top comments (3)

Collapse
 
raphaelgodart profile image
Raphaël Godart • Edited

First of all, I'm afraid this code is as human readable as it is machine readable. I suggest some refactoring. After 30 minutes, I was able to come up with this translation to VB.Net:

Imports System
Imports System.Collections.Generic

Namespace PreHOPL
    Module Program
        Private ReadOnly dict As Dictionary(Of String, Tuple(Of Integer, Action(Of String))) = New Dictionary(Of String, Tuple(Of Integer, Action(Of String))) From {{"SAYLIT", New Tuple(Of Integer, Action(Of String))(1, CType(AddressOf System.Console.WriteLine, Action(Of String)))}}

        Sub Main()
            dict("SAYLIT").Item2.DynamicInvoke("Hello World!")
        End Sub
    End Module
End Namespace

Collapse
 
bugmagnet profile image
Bruce Axtens

Thank you for spending so much time on it. I wonder if ValueTuple would simplifying it at all.

Collapse
 
bugmagnet profile image
Bruce Axtens

Building on @raphaelgodart 's approach and utilising ValueTuple:

Module Module1
    Private Const sSayLit As String = "SAYLIT"
    Private ReadOnly dict As Dictionary(
            Of String, (Arity As Integer, Proc As [Delegate])
        ) = New Dictionary(
            Of String, (Arity As Integer, Proc As [Delegate])
        ) From {
            {sSayLit, (1, CType(AddressOf Console.WriteLine, Action(Of String)))}
        }

    Sub Main()
        dict(sSayLit).Proc.DynamicInvoke("Hello VB.Net World!")
    End Sub

End Module