如何覆盖.NET类

时间:2012-04-29 13:24:29

标签: c# class override

作为一个例子,我试图改变GetResponse()

HttpWebRequest函数
class HttpWebRequest_Override : HttpWebRequest
{
    public HttpWebRequest_Override(System.Runtime.Serialization.SerializationInfo SerializationInfo, System.Runtime.Serialization.StreamingContext StreamingContext) 
        : base(SerializationInfo, StreamingContext) { }

    public override WebResponse GetResponse()
    {
        //Edit GetResponse() code here.
    }
}

但是我无法在任何地方找到GetResponse()的标准代码。我是否希望从零开始写一篇文章?我想复制+粘贴原始代码然后更改它。我已经尝试过查看here,但这没什么用。

为了测试我是否走在正确的轨道上,我评论了GetResponse()并尝试按原样使用HttpWebRequest_Override(仅使用构造函数)。

然后使用它:

public static string DownloadText(string url)
{
    try
    {
        var request = (HttpWebRequest_Override)WebRequest.Create(url);
        request.Proxy = null;
        var response = (HttpWebResponse)request.GetResponse();

        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            return reader.ReadToEnd();
        }
    }
    catch (Exception ex) { return "error_program : "+ex.Message; }
}

但这引发了错误:

Unable to cast object of type 'System.Net.HttpWebRequest' to type 'bulktest.HttpWebRequest_Override'.

所以有两个问题:

为什么这个类不起作用,哪里可以找到.NET类的代码,以便我可以改变它们?

3 个答案:

答案 0 :(得分:1)

可以通过.config文件“注入”自定义Web请求类型。

看看这里:http://msdn.microsoft.com/en-us/library/bc0fhzk5.aspx

答案 1 :(得分:1)

WebRequest.Create不会创建您的类的实例,它会创建一个HttpWebRequest实例,您可以从中派生它。虽然您可以将子实例转换为其父实例,但您不能将父实例转换为子实例。父母不保证拥有孩子的所有方法,而孩子则保证必须使用父母的方法。

您可以注册由您自己的派生类处理的自定义协议,或者通过配置注册您的类来处理默认协议。您是否需要这样做是一个悬而未决的问题。从您的示例中,一个简单的包装器可能就足够了。包装器将在构造函数中获取HttpWebRequest实例,并将标准WebRequest方法委托给该实例。任何新方法都会使用底层实例的方法进行工作,并将其他功能分层。

EX:

 var request = new WebRequestWrapper((HttpWebRequest)WebRequest.Create(url));
 var html = request.DownloadText();

您的课程可能如下:

 public class WebRequestWrapper
 {
      private HttpWebRequest _request;

      public WebRequestWrapper(HttpWebRequest request)
      {
          this._request = request;
      }

      public string DownloadText()
      {
          using (var response = (HttpWebResponse)this._request.GetResponse())
          using (var reader = new StreamReader(response.GetResponseStream()))
          {
              return reader.ReadToEnd();
          }
      }
 }

FWIW,我不喜欢捕获异常并返回一个字符串。我宁愿让异常冒泡,因为该方法返回一个字符串。

答案 2 :(得分:0)

您可以通过不同方式浏览.NET Framework源,例如,通过.NET Reflector。但您也可以在线查看 - 例如,这里是HttpWebRequest.GetResponse()的来源:

http://typedescriptor.net/browse/members/326374-System.Net.HttpWebRequest.GetResponse()

正如其他人所说,您不必复制粘贴原始代码。但知道它是如何工作的仍然很好。