如何在此过程中将Array作为参数传递?

时间:2013-07-06 03:34:32

标签: .net arrays vb.net overloading procedure

我有这个程序:

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

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

1 个答案:

答案 0 :(得分:1)

您必须使用two-dimensional array

执行此操作
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)} _
})

或使用jagged array

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