VS Macro / Add-in将字符串连接转换为string.format样式

时间:2010-07-28 12:24:27

标签: asp.net visual-studio string add-in visual-studio-macros

我在开发项目中,在很多地方都使用了诸如“Hi”+变量+“,欢迎使用Project”这样的字符串操作(例如,非常小的)。

其中一个要求是将其转换为string.format样式。

这是一项非常漫长而乏味的工作,因为在转换它时可能会发生任何人为错误,我不想打破以前的工作代码。

我想如果我可以创建任何宏或VS命令来处理它。就像我们标记代码块一样,并在Re-factor选项中执行Extract功能。

1 个答案:

答案 0 :(得分:2)

我觉得这里的代码有点长,但我在博客上发了一个答案: 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