C# 泛型类::类型参数<;T>;财产继承

C# 泛型类::类型参数<;T>;财产继承,c#,inheritance,types,properties,parameters,C#,Inheritance,Types,Properties,Parameters,我的代码: class ClassX; class Class2 : ClassX; class Class3 : ClassX; 类2和类3之间没有任何关联,除了它们共享相同的基类。Class2和Class3不共享相同的属性、数据类型或属性数量 现在,我想做的是: class Class<T> : T; static void Main() { Class<Class2> foo = new Class<Class2>(); foo.Cl

我的代码:

class ClassX;
class Class2 : ClassX;
class Class3 : ClassX;
类2和类3之间没有任何关联,除了它们共享相同的基类。Class2和Class3不共享相同的属性、数据类型或属性数量

现在,我想做的是:

class Class<T> : T;

static void Main()
{
    Class<Class2> foo = new Class<Class2>();
    foo.Class2_Property = value;

    Console.Read();
}
提前谢谢

PS:我已经就此提出了一个问题,但我不确定该如何提问,但我现在知道了。我把它打开了,以防有人通过我得到的答案找到他们问题的答案

编辑#1:

我有一个数据包类,它有共享的数据包属性和方法,不同的数据包有自己的头和不同的内容。我正在改变我的数据包系统。基本上我想做一个包,其中PacketClass是特定包的名称,例如LoginInfo。LoginInfo类将包含以下属性:

public PacketHeader Header;
public string Username;
public string Password;
因此:

    Packet<LoginInfo> foo = new Packet<LoginInfo>();
    foo.Username = "user";
    byte[] buf = foo.ToArray(); // Part of the Packet<T> class
packetfoo=newpacket();
foo.Username=“user”;
字节[]buf=foo.ToArray();//包类的一部分

这就是我的意思,每个类都有自己的属性。我希望这能让您对我要做的事情有一个很好的了解。

您可能想彻底重新考虑您的实现,因为这不是C#的设计目的。你可以做一些粗制滥造的事情来实现这一点,但这并不十分漂亮:

class Class<T> where T : new()
{
    public T Value = new T();
}
然后您可以像这样使用伪“派生”类:

Class<Class2> foo = new Class<Class2>();
var test = foo.Value.test;
Class foo=newclass();
var测试=foo.Value.test;

您还必须在
Class2
上公开您感兴趣的任何字段,才能使其正常工作。

使用C#无法完全实现您的目标,但您不应该这样做。
这是设计问题。该数据包不是数据包内容。它包含一些标题和一些内容:

interface IPacketItem
{
    byte[] ToArray();
}

class Packet<THeader, TContent>
    where THeader : IPacketItem
    where TContent : IPacketItem
{
    // header and content must be initialized somehow;
    // maybe, using existing instances, maybe using new() constraint
    public THeader Header { get; private set; }
    public TContent Content { get; private set; }

    public byte[] ToArray()
    {
        // builds an array using IPacketItem.ToArray
    }
}

var loginPacket = new Packet<PacketHeader, LoginInfo>();
loginPacket.Content.UserName = "user";
接口IPacketItem
{
字节[]ToArray();
}
类包
where THeader:ipackitem
其中t内容:IPacketItem
{
//标题和内容必须以某种方式初始化;
//可能,使用现有实例,可能使用new()约束
公共THeader头{get;private set;}
公共内容内容{get;private set;}
公共字节[]ToArray()
{
//使用iPackTitem.ToArray构建阵列
}
}
var loginPacket=新数据包();
loginPacket.Content.UserName=“用户”;

你想达到什么?这似乎是一个无法在C语言中包装<代码> T >代码的方法,因为C++模板和C泛型之间的性质不同。所以,最好解释一下,你打算如何/何时/何地使用它。我担心你的建议不会有帮助,赛斯。我是在建议我的想法,你可以在其中继续发展。我不知道,我不认为这是个XY问题。我要求在主要岗位上有一个变通办法,dcastro@Dennis,haim770:我用一个更清晰的例子更新了主要帖子,说明了我想做什么。我投票选择了Baldricks response作为答案,因为它是最接近我想做的事情的实现。虽然,您的实现是一个有趣的视角,也是一个很好的视角,所以我投了赞成票。谢谢你的帮助,丹尼斯。我希望这能回答其他人的问题。这并不是我想要解决这个问题的方式,但似乎没有其他办法,所以我只想通过“变通”来满足自己。很高兴能提供帮助!这是一个无耻的黑客,但它确实近似于你想要的行为至少。。。
Class<Class2> foo = new Class<Class2>();
var test = foo.Value.test;
interface IPacketItem
{
    byte[] ToArray();
}

class Packet<THeader, TContent>
    where THeader : IPacketItem
    where TContent : IPacketItem
{
    // header and content must be initialized somehow;
    // maybe, using existing instances, maybe using new() constraint
    public THeader Header { get; private set; }
    public TContent Content { get; private set; }

    public byte[] ToArray()
    {
        // builds an array using IPacketItem.ToArray
    }
}

var loginPacket = new Packet<PacketHeader, LoginInfo>();
loginPacket.Content.UserName = "user";