为什么我的WebRequest/HttpWebRequest对象有时需要强制转换,而其他时候不需要

本文关键字:转换 不需要 其他 WebRequest 我的 HttpWebRequest 对象 为什么 | 更新日期: 2023-09-27 17:50:12

我从Andy Wiggly的一篇文章中改编了这段代码(Andy Wiggly不只是"某个人",他为MS Press共同编写了"MS .NET Compact Framework"):

WebRequest request = HttpWebRequest.Create(uri);
request.Method = Enum.ToObject(typeof(HttpMethods), method).ToString();
request.ContentType = contentType;
((HttpWebRequest)request).Accept = contentType;
((HttpWebRequest)request).KeepAlive = false;
((HttpWebRequest)request).ProtocolVersion = HttpVersion.Version10;
if (method != HttpMethods.GET && method != HttpMethods.DELETE)
{
    Encoding encoding = Encoding.UTF8;
    request.ContentLength = encoding.GetByteCount(data);
    //request.ContentType = contentType; <= redundant; set above
    request.GetRequestStream().Write(
      encoding.GetBytes(data), 0, (int)request.ContentLength);
    request.GetRequestStream().Close();
}

注意如何在代码的第一个块我必须cast "request"作为HttpWebRequest;但是,在条件语句中,不需要强制转换。为什么会有不同呢?应该"WebRequest"是"HttpWebRequest"代替?如果我这样做,强制转换是灰色的,表明它是不必要的,但Wiggly必须这样做是有原因的,仍然:为什么在条件块中避免强制转换?

为什么我的WebRequest/HttpWebRequest对象有时需要强制转换,而其他时候不需要

HttpWebRequest.Create()是一个静态工厂。不能在派生类中重写该行为。根据您提供的URI,它可以创建HttpWebRequest或FtpWebRequest。都是从WebRequest派生出来的。当你知道你正在创建一个Http请求时,我建议你这样做:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri)

var request = (HttpWebRequest)WebRequest.Create(uri)


当你想要访问基类中不可用的派生类的特殊属性/方法时,你必须进行强制转换。

KeepAlive在WebRequest基类中不可用,因为它属于HttpWebRequest。

其他属性如Method是在基类中定义的,因此您不需要强制转换。