覆盖扩展方法C#

时间:2013-05-20 14:08:52

标签: c# extension-methods restsharp

我正在使用RestSharp为Web服务创建http请求。其中一个参数长度是非常长的> 100 K字符,所以我想我需要使用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 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()时,它会忽略它自己的扩展方法,而是调用我的扩展方法?

非常感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:3)

谢天谢地,我不知道。

的扩展方法s.UrlEncode()基本上是语法糖
StringExtensions.UrlEncode(s);

由于此方法是静态的,因此无法“覆盖”它。此外,它在编译时被绑定到该方法,因此在运行时无法将其重定向到其他方法。

也不应该被允许。如果是,你可以创建一个“覆盖”它来格式化你的C盘!。

如果您想使用其他版本,可以使用其他名称创建新的扩展方法,或找出缩短参数长度的方法。 :)

答案 1 :(得分:1)

一种解决方案是使用hiding through inheritance扩展现有的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上。

答案 2 :(得分:1)

查看this answer,了解如何使用RestSharp执行POST。有效负载位于消息正文中,而不是查询字符串中。