好的,我是stackoverflow的新手,请告诉我是否填写了一些内容。
我正在为套接字创建一个类库,然后使用类库来创建服务器。我遇到的问题是:
在类库中,我有一个名为sockets
的类,它有事件处理程序(你知道连接已经完成,关闭等等),而在我正在制作的服务器中,我有一个名为{{的类1}}继承自player
。
这个问题几乎归结为这个问题。
我使用sockets
事件处理程序来创建我的OnConnectionMade
,但因为我不能player
,即使我使用事件处理程序,事件处理程序也不会触发因为{{如果我通过参数,1}}没有指向instanceOfInheritedClass = intanceOfBaseClass
事件。
instanceOfInheritedClass
我提出的解决方案之一是,我可以在intanceOfBaseClass
类中将其设为void hostManager_OnConnectionMade(object source, ConnectionArgs e)
{
Player socket = new Player(e.GetSocket());
socket.OnDataRecivedPostConvert += Socket_OnDataRecivedPostConvertLogin;
}
public Player(DDSocket socket)
{
this.Host = socket.Host;
this.Socket = socket.Socket;
//this.OnConnectionClosed += socket.OnConnectionClosed;
//this.OnDataRecivedPostConvert += socket.OnDataRecivedPostConvert;
//this.OnDataRecivedPostConvertHost += socket.OnDataRecivedPostConvertHost;
}
参数,而不是继承。但是这会阻止我从我的事件处理程序中正确使用对象intanceOfBaseClass
,这意味着我需要使用linq或其他东西从player
中找到source
或类似的东西。
我想做的另一件事是以某种方式通过事件处理程序,你可以看到我试过,但不知道该怎么做。
现在经过几个小时的查找,我被困住了。任何帮助是极大的赞赏 任何解决这个问题的答案都没问题。我对它的解决方法并不挑剔。
答案 0 :(得分:0)
尽管您的Player
类继承自DDSocket
,但在这种情况下,它充当DBSocket
的包装类,所以有一个黑客可以实现这一点,我认为你必须做一些进一步的步骤:
class DDSocket
{
public event Action OnConnectionClosed;
public void Raise()
{
if (OnConnectionClosed != null)
{
OnConnectionClosed();
}
}
}
class Player :DDSocket
{
// make new event look as the same base class
public new event Action OnConnectionClosed;
public Player(DDSocket socket)
{
socket.OnConnectionClosed += Socket_OnConnectionClosed;
}
private void Socket_OnConnectionClosed()
{
if (OnConnectionClosed != null)
{
OnConnectionClosed();
}
}
}
// test those 2 classes
static void Main()
{
DDSocket d = new DDSocket();
Player pl = new Player(d);
pl.OnConnectionClosed += () => MessageBox.Show("test");
d.Raise();
}