在.NET中有没有办法inheritance没有构造函数的类?

我目前正在尝试修改一些HttpWebRequest函数,但我无法通过inheritance来实现,因为HttpWebRequest没有公共构造函数(除了反序列化构造函数)。 有没有解决方法来做到这一点?

我的目标是编写类似下面示例的代码,但此类对象必须inheritanceHttpWebRequest属性和方法:

using System; using System.Net; using System.Threading; public class AsyncWebRequest:WebRequest { private readonly AsyncCallback getResponseCallback; private readonly Uri uri; private volatile int RetriesLeft = 3; private volatile WebRequest request; public AsyncWebRequest(string uri, AsyncCallback getResponseCallback) :this(new Uri(uri), getResponseCallback) { } public AsyncWebRequest(Uri uri, AsyncCallback getResponseCallback):base() { this.uri = uri; this.getResponseCallback = getResponseCallback; } private IAsyncResult BeginGetResponse() { request = HttpWebRequest.CreateDefault(uri); ((HttpWebRequest)request).ReadWriteTimeout = Timeout; var result = request.BeginGetResponse(GetResponseCallback, null); ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, GetResponseTimeout, null, Timeout, true); return result; } private void GetResponseTimeout(object state, bool timedOut) { if (timedOut) { Retry(); } } private void Retry() { request.Abort(); bool retry = false; lock (request) { if (RetriesLeft > 0) { Interlocked.Decrement(ref RetriesLeft); retry = true; } } if (retry) { BeginGetResponse(); } else { getResponseCallback(null); } } private void GetResponseCallback(IAsyncResult AsyncResult) { try { getResponseCallback(AsyncResult); } catch(WebException webException) { Retry(); } } } 

除非你可以欺骗序列化构造函数来进行出价,否则就没有办法了。

该类的构造函数是内部的,因此您无法调用它们。

你不能通过inheritance来自HttpWebRequest(如果你不想调用序列化构造函数),但你可以通过组合和委托,以及通过WebRequest的inheritance(我不确定是否会为你做,但是在function上它非常相似)。 WebRequest有一个默认构造函数。

在这种情况下,你不能让类’是’一个HttpWebRequest(就像在一个is-a关系中),因为你不能从它扩展,但它将是一个WebRequest,这应该足够了。

您可以编写一个inheritance自WebRequest的类,该类具有WebRequest类型的实例成员,创建HttpWebRequest并在新类型的构造函数中分配实例成员,并委托对该引用的所有调用(类似于装饰器模式):

 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; namespace ClassLibrary1 { public class MyHttpWebRequest : WebRequest { private WebRequest request; public MyHttpWebRequest(string uri) { request = HttpWebRequest.Create(uri); } public override WebResponse GetResponse() { // do your extras, or just delegate to get the original code, as long // as you still keep to expected behavior etc. return request.GetResponse(); } } }