我有这个程序:
''' <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)})
(那段代码显然不起作用)
答案 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)})