覆盖扩展方法C#

覆盖扩展方法C#,c#,extension-methods,restsharp,C#,Extension Methods,Restsharp,我正在使用RestSharp创建对Web服务的http请求。其中一个参数length的运行时间非常长,大于100k个字符,因此我想我需要使用POST方法(因为GET对查询字符串长度的限制)。然而,当我尝试这样做时,我得到了一个异常,uri太长。我下载了他们的源代码来找出原因。请看下面的代码: querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), p.Value.UrlEncode()); 现在UrlEncode()方法是StringEx

我正在使用RestSharp创建对Web服务的http请求。其中一个参数length的运行时间非常长,大于100k个字符,因此我想我需要使用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个字符的字符串(请参阅post-)

如果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(此字符串输入)
{
整数极限=65520;
StringBuilder sb=新的StringBuilder();
int循环=输入。长度/限制;

对于(int i=0;i一种解决方案是使用扩展现有的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

希望这有帮助

问候,,
P.

谢天谢地,据我所知,没有办法。扩展方法

s.UrlEncode()
基本上是对

StringExtensions.UrlEncode(s);
由于此方法是静态的,因此无法“重写”它。此外,它在编译时绑定到该方法,因此无法在运行时将其重定向到其他方法

这也是不允许的。如果允许,您可以创建一个“覆盖”来格式化您的C驱动器


如果要使用不同的版本,可以使用不同的名称创建新的扩展方法,或者找到缩短参数长度的方法。:)

查看如何使用RestSharp执行
POST
。有效负载放在消息正文中,而不是查询字符串中。

唯一的问题是,如果第三方决定将其向下转换为
Uri
(或者如果它被传递到任何采用
Uri
的代码中,包括
Uri
中可能利用它的任何方法)然后调用原始的
UrlEncode
方法。如果您将有效负载附加到查询字符串以执行POST,那么您就做错了……我不能说这是否是正确的方法,但这是OSS,因此您可以始终更改源代码并发出拉取请求。至少,您可以始终创建CU汤姆版本