C# 在C中扩展TcpClient类#

C# 在C中扩展TcpClient类#,c#,.net,C#,.net,我正在编写服务器应用程序,我想这样做: class MyClient : TcpClient { public StreamReader Reader { get; } public StreamWriter Writer { get; } public MyClient() { Reader = new StreamReader(this.GetStream()); Writer = new StreamW

我正在编写服务器应用程序,我想这样做:

class MyClient : TcpClient
{        
    public StreamReader Reader { get; }
    public StreamWriter Writer { get; }
    public MyClient()
    {
          Reader = new StreamReader(this.GetStream());
          Writer = new StreamWriter(this.GetStream());           
    }       
}
然后我要侦听传入连接并创建
MyClient
对象:

TcpListener listener= new TcpListener(IPAddress.Parse(Constants.IpAddress), Constants.Port);
MyClient client = (MyClient)listener.AcceptTcpClient();
我知道我不能这样沮丧(
TcpClient
不是
MyClient
)。 但是
MyClient
TcpClient
,那么我需要做什么来完成这样的场景呢? 创建一个
MyClient
构造函数,该构造函数接受
TcpClient
参数并调用base
TcpClient
类构造函数。我希望
MyClient
成为
TcpClient
而不是
TcpClient
属性。或者Socket类在我的情况下会更好?

做什么

(MyClient)listener.AcceptTcpClient();
无论您做什么,它都不会工作,因为它总是返回常规的
TcpClient
(并且此方法在
TcpListener
中不是虚拟的,因此您无法更改它)。与
AcceptSocket
的情况相同。您可以创建一个代理类,该类不会从
TcpClient
继承,但将实现所有相同的公共成员,并将其实现代理到存储在private字段中并传递给构造函数的real
TcpClient
。但是,您不能将该类传递给任何需要常规
TcpClient
的方法

AcceptTcpClient
的实现使用接受套接字的构造函数创建
TcpClient
,但是此构造函数是内部的,因此不能使用这种方法

我想到的另一个选择是:

class MyClient : TcpClient
{
    public StreamReader Reader { get; }
    public StreamWriter Writer { get; }
    public MyClient(Socket acceptedSocket)
    {
        this.Client.Dispose();
        this.Client = acceptedSocket;
        this.Active = true;
        Reader = new StreamReader(this.GetStream());
        Writer = new StreamWriter(this.GetStream());
    }
}

然后将套接字从
AcceptSocket
传递给构造函数。但是我不喜欢它,因为
TcpClient
的默认构造函数将被调用,这将创建新的套接字(在上面构造函数的第一行处理)。

我也不喜欢这个默认构造函数,但它仍然是解决我问题的一个很好的方法。谢谢:)P.S是否需要设置活动属性?@KarolŻurowski是的。