重写C#扩展方法

3
我正在使用RestSharp创建向webservice发送http请求。其中一个参数的长度非常长,超过了100K个字符,因此我认为需要使用POST方法(由于GET方法对查询字符串长度有限制)。但是,当我尝试使用POST方法时,出现了异常,提示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() - Invalid URI: The Uri string is too long
如果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()时,它会忽略自己的扩展方法而是调用我的扩展方法?任何帮助都将不胜感激。谢谢。

1
如果您正在将有效负载附加到查询字符串以执行POST操作,则操作不正确... - Matt Mills
我不能确定这是否是正确的方法,但这是开源软件,所以您可以随时更改源代码并发起拉取请求。最少,您也可以创建一个自定义版本。 - Justin Pihony
3个回答

3

谢天谢地,我不知道有什么方法可以做到。扩展方法s.UrlEncode()基本上是语法糖,用于对以下内容进行编码:

StringExtensions.UrlEncode(s);

由于这个方法是静态的,所以无法“覆盖”它。此外,在编译时绑定到该方法,因此无法在运行时将其重定向到不同的方法。
也不应该允许这样做。如果允许,您可能会创建一个“覆盖”,以格式化您的C驱动器!
如果您想使用不同的版本,则可以创建一个新的扩展方法并赋予其不同的名称,或者找出一种缩短参数长度的方法。 :)

1

一种解决方案是通过继承扩展现有的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.


3
问题在于,如果第三方决定将其降级为 Uri(或者如果它传递到任何需要 Uri 的代码中,包括 Uri 内可能利用它的 任何 方法),那么就会调用 原始的 UrlEncode 方法。 - Chris Sinclair

1

请查看这个答案,了解如何使用RestSharp进行POST。负载放在消息正文中,而不是查询字符串中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接