Как мне перенести расширение в VB.NET на C #?

1

Я написал расширение в 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
Теги:
extension-methods
stringbuilder

3 ответа

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.

  • 1
    Параметр args четвертого метода должен быть объявлен как params object[] args .
  • 0
    Спасибо, Люк. Могу ли я узнать, почему это должно быть?
Показать ещё 5 комментариев
7

Я бы не вложил вызовы string.Format() вроде этого.

Знаете ли вы, что string.Format() создает новый StringBuilder за кулисами и вызывает его AppendFormat() метод? Используя первый метод там, как пример, это должно быть намного более эффективным:

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

Вы также должны внести такое же изменение в свой код VB.

  • 0
    отлично, спасибо за это. Я обновлю свой код
  • 0
    это хороший улов.
0

Я никогда раньше не использовал конвертер кода 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
//=======================================================
  • 0
    Спасибо Крис, но это не работает. Сначала я делал то же самое (тоже самое!), Но синтаксис для расширения C # немного отличается от синтаксиса VB.NET. Примечательно, что [Extension ()] не является обязательным, к этому аргументу должен быть добавлен 'this' (в данном случае это объект stringbuilder). Спасибо за вклад, хотя!
  • 0
    Нет проблем. Я всегда хотел найти причину для тестирования конвертера Telerik. Я думаю, что лучше всего делать это вручную, с помощью SO. :-)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню