我有一个正在开发的项目,其中许多地方都使用了诸如“Hi”+变量+“,欢迎来到项目”之类的字符串操作(给定的例子是非常小的一个)。
要求之一是将其转换为 string.format 样式。
这是一项非常漫长而乏味的工作,我不想破坏早期的工作代码,因为在转换它时可能会发生任何人为错误。
我想如果我可以创建任何宏或 VS 命令来处理它。就像我们在 Re-factor 选项中标记代码块并执行提取功能一样。
我有一个正在开发的项目,其中许多地方都使用了诸如“Hi”+变量+“,欢迎来到项目”之类的字符串操作(给定的例子是非常小的一个)。
要求之一是将其转换为 string.format 样式。
这是一项非常漫长而乏味的工作,我不想破坏早期的工作代码,因为在转换它时可能会发生任何人为错误。
我想如果我可以创建任何宏或 VS 命令来处理它。就像我们在 Re-factor 选项中标记代码块并执行提取功能一样。
我觉得这里发布的代码有点长,但我在我的博客上发布了一个答案: http ://www.brianschmitt.com/2010/08/converting-concatenated-string-into.html
- 编辑 - 这里的每条评论是相关的宏 - 不知道为什么你不能访问......
Public Sub ConvertToStringFormat()
DTE.UndoContext.Open("ConvertToStringFormat")
Dim textSelection As TextSelection = DTE.ActiveDocument.Selection
Dim output As String = "string.Format(""{0}"", {1})"
Dim delimt As String = ", "
Dim fmtdTostring As String = ".tostring("""
Dim txtSelection As String() = System.Text.RegularExpressions.Regex.Split(textSelection.Text.Trim, "\+\s_[+\n\r\t]|&\s_[+\n\r\t]|\+|&")
Dim hardStrings As String = String.Empty
Dim valueStrings As String = String.Empty
Dim counter As Int16 = 0
For Each str As String In txtSelection
Dim tmpString As String = str.Trim
If tmpString.StartsWith("""") Then
hardStrings &= tmpString.Substring(1, tmpString.Length - 2)
Else
Dim fmt As String = String.Empty
Dim indxToString As Int32 = 0
If tmpString.ToLower.Contains(fmtdTostring) Then
indxToString = tmpString.ToLower.IndexOf(fmtdTostring)
fmt = tmpString.Substring(indxToString + 11, tmpString.Length - tmpString.ToLower.IndexOf(""")", indxToString) - 1)
End If
If fmt <> String.Empty Then
hardStrings &= "{" & counter.ToString & ":" & fmt & "}"
valueStrings &= tmpString.Substring(0, indxToString) & delimt
Else
hardStrings &= "{" & counter.ToString & "}"
valueStrings &= tmpString & delimt
End If
counter += 1
End If
Next
If valueStrings <> String.Empty Then valueStrings = valueStrings.Substring(0, valueStrings.Length - delimt.Length)
textSelection.Text = String.Format(output, hardStrings, valueStrings)
DTE.UndoContext.Close()
End Sub