【问题标题】:How do I port an extension in VB.NET to C#?如何将 VB.NET 中的扩展移植到 C#?
【发布时间】:2009-08-13 15:01:49
【问题描述】:

我在 VB.NET 中为 StringBuilder 编写了一个扩展,以添加一个 AppendFormattedLine 方法(因此我不必为换行符使用其中一个参数):

Imports System.Runtime.CompilerServices
Public Module sbExtension
    <Extension()> _
    Public Sub AppendFormattedLine(ByVal oStr As System.Text.StringBuilder, _
                                   ByVal format As String, _
                                   ByVal arg0 As Object)
        oStr.AppendFormat(format, arg0).Append(ControlChars.NewLine)
    End Sub
    <Extension()> _
    Public Sub AppendFormattedLine(ByVal oStr As System.Text.StringBuilder, _
                                   ByVal format As String, ByVal arg0 As Object, _
                                   ByVal arg1 As Object)
        oStr.AppendFormat(format, arg0, arg1).Append(ControlChars.NewLine)
    End Sub
    <Extension()> _
    Public Sub AppendFormattedLine(ByVal oStr As System.Text.StringBuilder, _
                                   ByVal format As String, _
                                   ByVal arg0 As Object, _
                                   ByVal arg1 As Object, _
                                   ByVal arg2 As Object)
        oStr.AppendFormat(format, arg0, arg1, arg2).Append(ControlChars.NewLine)
    End Sub
    <Extension()> _
   Public Sub AppendFormattedLine(ByVal oStr As System.Text.StringBuilder, _
                                  ByVal format As String, _
                                  ByVal ParamArray args() As Object)
        oStr.AppendFormat(format, args).Append(ControlChars.NewLine)
    End Sub
End Module

【问题讨论】:

    标签: c# vb.net extension-methods stringbuilder


    【解决方案1】:

    我不会像这样嵌套string.Format() 调用。

    您知道string.Format() 在幕后创建了一个新的StringBuilder 并调用它的AppendFormat() 方法吗?以上面的第一种方法为例,这应该会更有效:

    sb.AppendFormat(format, arg0).Append(Environment.NewLine);
    

    您也应该对 VB 代码进行相同的更改。

    【讨论】:

      【解决方案2】:

      这是我想出的移植代码:

      using System;
      using System.Text;
      
      public static class ExtensionLibrary
      {
          public static void AppendFormattedLine(this StringBuilder sb, string format, object arg0)
          {
              sb.AppendFormat(format, arg0).Append(Environment.NewLine);
          }
          public static void AppendFormattedLine(this StringBuilder sb, string format, object arg0, object arg1)
          {
              sb.AppendFormat(format, arg0, arg1).Append(Environment.NewLine);
          }
          public static void AppendFormattedLine(this StringBuilder sb, string format, object arg0, object arg1, object arg2)
          {
              sb.AppendFormat(format, arg0, arg1, arg2).Append(Environment.NewLine);
          }
          public static void AppendFormattedLine(this StringBuilder sb, string format, params object[] args)
          {
              sb.AppendFormat(format, args).Append(Environment.NewLine);
          }
      }
      

      希望这对某人有用!

      改进的代码,感谢 joel、luke 和 jason。

      【讨论】:

      • 第四种方法的args参数要声明为params object[] args
      • 谢谢卢克。请问为什么会这样?
      • @Anders:首先,让它匹配 c# 签名。其次,因为它提供了一些额外的语法糖——你可以将一堆对象作为它们自己的参数传递给方法,而不必构造一个数组。
      • 好的,如果我的理解正确,我可以这样做:sb.AppendFormattedLine("{0} {1} {2} {3} {4}", "Val1", "Val2", "Val3", "Val4", "Val5") 而不是:sb.AppendFormattedLine("{0} {1} {2} {3} {4}", new object[] {"Val1", "Val2", "Val3", "Val4", "Val5"})?
      • 您可以摆脱所有这些额外的方法,只使用带有 params object[] 参数的方法。 params 关键字将收集从该点向前传递给方法的所有参数,并将它们传递给 args 数组中的方法体。然后你只需将该 arg 数组传递给 format 方法。
      【解决方案3】:

      我以前从未使用过 Telerik 的代码转换器,但它的想法是这样的:

      public class sbExtension
      {
          [Extension()]
          public void AppendFormattedLine(System.Text.StringBuilder oStr, string format, object arg0)
          {
              oStr.AppendFormat(format, arg0).Append(ControlChars.NewLine);
          }
          [Extension()]
          public void AppendFormattedLine(System.Text.StringBuilder oStr, string format, object arg0, object arg1)
          {
              oStr.AppendFormat(format, arg0, arg1).Append(ControlChars.NewLine);
          }
          [Extension()]
          public void AppendFormattedLine(System.Text.StringBuilder oStr, string format, object arg0, object arg1, object arg2)
          {
              oStr.AppendFormat(format, arg0, arg1, arg2).Append(ControlChars.NewLine);
          }
          [Extension()]
          public void AppendFormattedLine(System.Text.StringBuilder oStr, string format, params object[] args)
          {
              oStr.AppendFormat(format, args).Append(ControlChars.NewLine);
          }
      }
      
      
      //=======================================================
      //Service provided by Telerik (www.telerik.com)
      //Conversion powered by NRefactory.
      //Built and maintained by Todd Anglin and Telerik
      //=======================================================
      

      【讨论】:

      • 谢谢克里斯,但这不起作用。一开始我实际上做了完全相同的事情(同样的转换器!),但是 C# 扩展的语法与 VB.NET 略有不同。值得注意的是 [Extension()] 不是必需的,'this' 必须添加到第一个参数(在这种情况下为 stringbuilder 对象)之前。不过,感谢您的意见!
      • 没问题。我一直想有一个理由来测试 Telerik 的转换器。我想最好在 SO 的帮助下手工完成。 :-)
      • 它大部分时间都有效,只是某些东西没有正确转换。就像你说的,那就是我们来到 SO 的时候!
      猜你喜欢
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多