Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将方法返回类型设置为与其当前所在的类相同_C#_Class_Networking - Fatal编程技术网

C# 如何将方法返回类型设置为与其当前所在的类相同

C# 如何将方法返回类型设置为与其当前所在的类相同,c#,class,networking,C#,Class,Networking,中级C#程序员在这里。我正在编写一个网络包装器,希望每种类型的数据包都能够定义自己的“OpenPacket”方法,该方法将接收与当前类相同类型的类的参数。我还需要另一个方法“WriteToPacket”,它将返回与其当前类相同类型的数据包 MessagePacket类的WriteToPacket将返回MessagePacket。我将使用继承并只返回一个数据包类型,但每个数据包都有不同的变量。此外,我正在将其开发为一个库,因此我希望能够在dll之外定义新的数据包类型 我有一个包类型的接口 publ

中级C#程序员在这里。我正在编写一个网络包装器,希望每种类型的数据包都能够定义自己的“OpenPacket”方法,该方法将接收与当前类相同类型的类的参数。我还需要另一个方法“WriteToPacket”,它将返回与其当前类相同类型的数据包

MessagePacket类的WriteToPacket将返回MessagePacket。我将使用继承并只返回一个数据包类型,但每个数据包都有不同的变量。此外,我正在将其开发为一个库,因此我希望能够在dll之外定义新的数据包类型

我有一个包类型的接口

public interface IPacket_Type<T> where T : class
{
    T OpenPacketFromMessage(NetIncomingMessage msg) ;
    NetOutgoingMessage PackPacketIntoMessage(NetOutgoingMessage msg, T packet);
}
公共接口IPacket\u类型,其中T:class
{
T打开packetfromMessage(NetIncomingMessage msg);
NetOutgoingMessage PackPacketIntoMessage(NetOutgoingMessage msg,T packet);
}
我把它当作包的一部分

public class TestPacket : Packet, IPacket_Type<TestPacket> {
    public int testInt;

    public TestPacket(string packet_name) : base(packet_name){}

    public TestPacket OpenPacketFromMessage(NetIncomingMessage msg)
    {
        TestPacket packet = new TestPacket(packet_name);
        packet.testInt = msg.ReadInt32();

        return packet;
    }

    public NetOutgoingMessage PackPacketIntoMessage(NetOutgoingMessage msg, TestPacket packet)
    {
        msg.Write(packet_name);
        msg.Write(packet.testInt);
        return msg;
    }
}
公共类测试包:包,IPacket\u类型{
公共智力测验;
publictestpacket(字符串packet\u name):基(packet\u name){}
公共测试包OpenPacketFromMessage(NetIncomingMessage消息)
{
TestPacket数据包=新的TestPacket(数据包名称);
packet.testInt=msg.ReadInt32();
返回包;
}
公共NetOutgoingMessage包PackageToMessage(NetOutgoingMessage消息,测试包)
{
msg.Write(数据包名称);
msg.Write(packet.testInt);
返回味精;
}
}
在服务器端收到类名后,我希望能够实例化这样的类。例如,创建一个TestPacket实例,而不是一个数据包实例。我考虑这样做的一种方法是创建一个返回其当前类型的包类,因此允许我将其用作基,始终返回类的类型


任何帮助都将不胜感激,谢谢

在下面的代码中,我将向您展示一些如何使用同一类实例的示例:

公共类示例{
//此方法返回示例类的相同实例
公共示例ReturnSampleInstance(){
归还这个;
}
//此方法使用其他数据创建类的全新实例
public Sample ReturnAnotherSampleInstance(){
var样本=新样本();
//使用新的示例实例执行一些逻辑或填充一些数据
返回样品;
}
//此方法接收同一类的实例并返回它
公共示例ReceivesSampleInstance和Returnit(示例sampleInstance){
返回样本实例;
}
}
如果希望使用接口,并且接口的方法将返回类型作为实现类,则可以按如下方式执行:

//通用接口
公共接口很简单{
t使用接口()实现GetCurrentInstance;
}
//类,该类实现接口并将自身作为泛型参数传递给ISample接口
公共类示例:ISample{
//此方法返回示例类的相同实例
公共示例ReturnSampleInstance(){
归还这个;
}
//此方法使用其他数据创建类的全新实例
public Sample ReturnAnotherSampleInstance(){
var样本=新样本();
//使用新的示例实例执行一些逻辑或填充一些数据
返回样品;
}
//此方法接收同一类的实例并返回它
公共示例ReceivesSampleInstance和Returnit(示例sampleInstance){
返回样本实例;
}
//通过接口的方法获取类的当前实例
公共示例GetCurrentInstanceUsingAnterface(){
归还这个;
}
}

你好,谢谢你的回复!是的,我最初考虑过这样做,但现在每个数据包都使用一个接口,其中需要描述返回方法。我已经使用了泛型,但是稍后我需要检索类类型。同样的事情也可以使用泛型类型来完成。你能提供更多的上下文吗?我想我已经明白你想要什么了。如果您想让界面返回实际实现的实例,可以使用通用参数TImplementation来实现,我编辑了代码,向您展示了我如何使用更具体的信息更新文章。你能看一看吗?如果你让包基类类型泛型,以接受一个实现,就像接口一样?