1

我有这个程序:

    ''' <summary>
    ''' Append text to the current text.
    ''' </summary>
    ''' <param name="text">The text to append</param>
    ''' <param name="forecolor">The font color</param>
    ''' <param name="backcolor">The Background color</param>
    ''' <param name="font">The font of the text</param>
    Public Sub Append_Text(ByVal text As String, _
                          ByVal forecolor As Color, _
                          Optional ByVal backcolor As Color = Nothing, _
                          Optional ByVal font As Font = Nothing)

        Dim index As Int32 = MyBase.TextLength
        MyBase.AppendText(text)
        MyBase.SelectionStart = index
        MyBase.SelectionLength = MyBase.TextLength - index
        MyBase.SelectionColor = forecolor
        If Not backcolor = Nothing Then MyBase.SelectionBackColor = backcolor
        If font IsNot Nothing Then MyBase.SelectionFont = font
        MyBase.SelectionStart = MyBase.TextLength
        MyBase.SelectionLength = 0

    End Sub

我这样调用程序:

RichTextLabel1.Append_Text("My ", Color.White, color.transparent, New Font("Arial", 12, FontStyle.Bold))
RichTextLabel1.Append_Text("RichText-", Color.White, , New Font("Arial", 12, FontStyle.Bold))

我的问题是我是否可以通过使用如下参数数组进行一次重载(以及如何进行修改)来调用 proc:

RichTextLabel1.Append_Text( _
{"My ", Color.White, Color.Transparent, New Font("Arial", 12, FontStyle.Bold)}, _
{"RichTextLabel", Color.White, Nothing, New Font("Arial", 16, FontStyle.Bold)})

(那段代码显然不起作用)

4

1 回答 1

1

您必须使用二维数组来执行此操作:

Public Sub Append_Text(ByVal parameters As Object(,))
    If UBound(parameters, 2) <> 3 Then
        Throw new ArgumentException("Array was not the correct size", "parameters")
    End If

    For i As Integer = 0 To UBound(parameters, 1)
        Append_Text( _
            CType(parameters(i, 0), String), _
            CType(parameters(i, 1), Color), _
            CType(parameters(i, 2), Color), _
            CType(parameters(i, 3), Font))
    Next
End Sub

RichTextLabel1.Append_Text({ _
    {"My ", Color.White, Color.Transparent, New Font("Arial", 12, FontStyle.Bold)}, _
    {"RichTextLabel", Color.White, Nothing, New Font("Arial", 16, FontStyle.Bold)} _
})

或者使用锯齿状数组

Public Sub Append_Text(ByVal parameters As Object()())
    For Each p In parameters
        If UBound(p) <> 3 Then
            Throw new ArgumentException("Array was not the correct size", "parameters")
        End If

        Append_Text( _
            CType(p(i)(0), String), _
            CType(p(i)(1), Color), _
            CType(p(i)(2), Color), _
            CType(p(i)(3), Font))
    Next
End Sub

RichTextLabel1.Append_Text({ _
    New Object(){"My ", Color.White, Color.Transparent, New Font("Arial", 12, FontStyle.Bold)}, _
    New Object(){"RichTextLabel", Color.White, Nothing, New Font("Arial", 16, FontStyle.Bold)} _
})

但最接近您所要求的是带有ParamArray关键字的锯齿状数组:

Public Sub Append_Text(ByVal ParamArray parameters As Object()())
    ' Same as Above
End Sub

RichTextLabel1.Append_Text( _
    {"My ", Color.White, Color.Transparent, New Font("Arial", 12, FontStyle.Bold)}, _
    {"RichTextLabel", Color.White, Nothing, New Font("Arial", 16, FontStyle.Bold)})

当然,所有情况的问题在于您完全失去了编译时类型安全性。没有什么可以阻止用户传入错误类型的参数或错误数量的参数(尽管我添加了简单的运行时检查来说明如何做到这一点)。最终,如果目标是减少添加多个项目所需的代码行数,请注意,简单地调用该方法两次实际上比您要求的代码行数更少:

' 2 lines of code
RichTextLabel1.Append_Text("My ", Color.White, Color.Transparent, New Font("Arial", 12, FontStyle.Bold))
RichTextLabel1.Append_Text("RichTextLabel", Color.White, Nothing, New Font("Arial", 16, FontStyle.Bold))

' 3 lines of code
RichTextLabel1.Append_Text( _
    {"My ", Color.White, Color.Transparent, New Font("Arial", 12, FontStyle.Bold)}, _
    {"RichTextLabel", Color.White, Nothing, New Font("Arial", 16, FontStyle.Bold)})
于 2013-07-06T03:59:16.760 回答