Skip to content

Instantly share code, notes, and snippets.

@VBAndCs
Last active January 31, 2022 01:12
Show Gist options
  • Save VBAndCs/19807454011e66aaa5ad869b0bac6f71 to your computer and use it in GitHub Desktop.
Save VBAndCs/19807454011e66aaa5ad869b0bac6f71 to your computer and use it in GitHub Desktop.
Using interpolated string handlers in VB.NET

Usage

        Dim Ali As Object = "Ali"
        Dim age = 16
        Dim x As String = "Students: ".CrLf.
            str("Name: ").arg(Ali, -5).
            str(", Age: ").arg(age, 7, "N2").CrLf.
            str("Name: ").arg("Yaser").
            str(", Age: ").arg(20, 7, "N2")

or

      Dim Ali As Object = "Ali"
      Dim age = 16
      Dim x As String = "Students: ".CrLf _
          add("Name: ", Ali, -5).
          add(", Age: ", age, 7, "N2").CrLf.
          add("Name: ", "Yaser").
          add(", Age: ", 20, 7, "N2")

or

      Dim Ali As Object = "Ali"
      Dim age = 16
      Dim x As String = "Students: ".CrLf _
         ("Name: ", Ali, -5)(", Age: ", age, 7, "N2").CrLf _
         ("Name: ", "Yaser")(", Age: ", 20, 7, "N2")

The Joiner Class:

Public Class Joiner
    Dim sb As New StringBuilder
    Dim handler As New StringBuilder.AppendInterpolatedStringHandler(100, 5, sb)

    Public Function add(s As String) As Joiner
        sb.Append(s)
        Return Me
    End Function

    Public Function add(Of T)(obj As T, Optional alignment As Integer = 0, Optional format As String = "") As Joiner
        handler.AppendFormatted(obj, alignment, format)
        Return Me
    End Function

    Public Function add(Of T)(str As String, obj As T, Optional alignment As Integer = 0, Optional format As String = "") As Joiner
        sb.Append(str)
        handler.AppendFormatted(obj, alignment, format)
        Return Me
    End Function

    Public Function str(s As String) As Joiner
        sb.Append(s)
        Return Me
    End Function

    Public Function arg(Of T)(obj As T, Optional alignment As Integer = 0, Optional format As String = "") As Joiner
        handler.AppendFormatted(obj, alignment, format)
        Return Me
    End Function

    Public Function CrLf() As Joiner
        sb.Append(vbCrLf)
        Return Me
    End Function

    Default Public ReadOnly Property adding(s As String) As Joiner
        Get
            sb.Append(s)
            Return Me
        End Get
    End Property

    Default Public ReadOnly Property adding(obj As Object, Optional alignment As Integer = 0, Optional format As String = "") As Joiner
        Get
            handler.AppendFormatted(obj, alignment, format)
            Return Me
        End Get
    End Property

    Default Public ReadOnly Property adding(str As String, obj As Object, Optional alignment As Integer = 0, Optional format As String = "") As Joiner
        Get
            sb.Append(str)
            handler.AppendFormatted(obj, alignment, format)
            Return Me
        End Get
    End Property

    Public Overrides Function ToString() As String
        Return sb.ToString()
    End Function

    Public Shared Widening Operator CType(j As Joiner) As String
        Return j.ToString()
    End Operator
End Class

Extension methods:

Imports System.Runtime.CompilerServices

Public Module ParsingExtensions
    <Extension()>
    Public Function CrLf(input As String) As Joiner
        Dim j As New Joiner
        Return j.Add(input).Add(vbCrLf)
    End Function

    <Extension()>
    Public Function add(input As String, s As String) As Joiner
        Dim j As New Joiner
        Return j.Add(input).Add(s)
    End Function

    <Extension()>
    Public Function add(Of T)(input As String, obj As T, Optional alignment As Integer = 0, Optional format As String = "") As Joiner
        Dim j As New Joiner
        Return j.Add(input).Add(obj, alignment, format)
    End Function

    <Extension()>
    Public Function add(Of T)(input As String, str As String, obj As T, Optional alignment As Integer = 0, Optional format As String = "") As Joiner
        Dim j As New Joiner
        Return j.Add(input).Add(str).Add(obj, alignment, format)
    End Function

    <Extension()>
    Public Function str(input As String, s As String) As Joiner
        Dim j As New Joiner
        Return j.Add(input).Add(s)
    End Function

    <Extension()>
    Public Function arg(Of T)(input As String, obj As T, Optional alignment As Integer = 0, Optional forma As String = "") As Joiner
        Dim j As New Joiner
        Return j.Add(input).Add(obj, alignment, forma)
    End Function


End Module
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment