Перезапись метода расширения C#

Я использую RestSharp для создания http-запросов к веб-сервису. Длина одного из параметров очень длинная > 100 тыс. символов, поэтому я решил, что мне нужно будет использовать метод POST (из-за ограничений на длину строки запроса с помощью GET). Однако, когда я попытался это сделать, я получил исключение, что uri слишком длинный. Я скачал их исходный код, чтобы узнать почему. Взгляните на следующий код:

querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), p.Value.UrlEncode());

Теперь метод UrlEncode() является методом расширения, доступным в классе StringExtensions.cs, и его реализации выглядят так:

public static string UrlEncode(this string input)
    {
        return Uri.EscapeDataString(input);
    }

Проблема в том, что Uri.EscapeDataString не может обработать строку длиной более 65519 символов (см. сообщение - Uri.EscapeDataString() - Недопустимый URI: строка Uri слишком длинная)

Моя проблема может быть решена, если метод расширения UrlEncode был реализован следующим образом

public static string UrlEncode(this string input)
    {
        int limit = 65520;

        StringBuilder sb = new StringBuilder();
        int loops = input.Length / limit;

        for (int i = 0; i <= loops; i++)
        {
            if (i < loops)
            {
                sb.Append(Uri.EscapeDataString(input.Substring(limit * i, limit)));
            }
            else
            {
                sb.Append(Uri.EscapeDataString(input.Substring(limit * i)));
            }
        }

        return sb.ToString();
    }

Проблема в том, что я НЕ хочу изменять исходный код. Есть ли способ, которым я могу написать свой собственный метод расширения в МОЕМ исходном коде, чтобы, когда сторонний код пытается вызвать UrlEncode(), он игнорировал свой собственный метод расширения и вместо этого вызывал мой метод расширения??

Любая помощь горячо приветствуется. Спасибо.


person user2401967    schedule 20.05.2013    source источник
comment
Если вы добавляете полезную нагрузку в строку запроса для выполнения POST, вы делаете это неправильно...   -  person Matt Mills    schedule 20.05.2013
comment
Я не могу сказать, правильный это подход или нет, но это OSS, поэтому вы всегда можете внести изменения в исходный код и сделать запрос на включение. Как минимум, вы всегда можете создать собственную версию   -  person Justin Pihony    schedule 20.05.2013


Ответы (3)


К счастью, я не знаю такого способа. Метод расширения s.UrlEncode() в основном является синтаксическим сахаром для

StringExtensions.UrlEncode(s);

Поскольку этот метод является статическим, его невозможно «переопределить». Кроме того, он привязывается к этому методу во время компиляции, поэтому нет возможности перенаправить его на другой метод во время выполнения.

Это также НЕ должно быть разрешено. Если бы это было так, вы могли бы создать «переопределение» для форматирования диска C!.

Если ВЫ хотите использовать другую версию, вы можете создать новый метод расширения с другим именем или найти способ сократить длину параметров. :)

person D Stanley    schedule 20.05.2013

одним из решений было бы расширение существующего класса Uri с помощью скрытие посредством наследования — вы должны унаследовать существующий класс Uri, а затем переопределить нужный метод с помощью оператора new. Таким образом вы измените поведение по умолчанию без изменения исходного кода. Пример кода:

public class A
{
    public int Get1()
    {
        return 1;
    }

    public int Get2()
    {
        return 100;
    }
}

public class B : A
{
    // override A's Get1
    public new int Get1()
    {
        return 2;
    }
}

и вывод вызова:

var b = new B();
System.Console.WriteLine(string.Format("{0} - {1}", b.Get1(), b.Get2()));

было бы:

2 - 100

а не 1 - 100!

Надеюсь это поможет.

С уважением, П.

person keenthinker    schedule 20.05.2013
comment
Единственная проблема заключается в том, что если третья сторона решит понизить его до Uri (или если он будет передан в любой код, который принимает Uri, включая любые методы в Uri который может использовать его), то вызывается метод original UrlEncode. - person Chris Sinclair; 20.05.2013

Ознакомьтесь с этим ответом, чтобы узнать, как выполнить POST с помощью RestSharp. Полезная нагрузка находится в теле сообщения, а не в строке запроса.

person Matt Mills    schedule 20.05.2013