数组中的不同类型,如何在将它们从数组中取出时知道将它们转换为什么?

假设类型为Packet的通用List ,包含扩展Packet的自定义类,例如LoginPacketChatPacket

假设我将这些放在列表中。 当我拿出它们时,每个最“特定”的类型是Packet 。 我想把它们转换成更具体的类型,然后回到原来的LoginPacketChatPacket,或者回到原来的类型。

问题:我该怎么办?

参考: 如何在运行时以编程方式转换对象?

所以…似乎这些自定义类共享一个通用接口,它会解决转换问题吗? 但如果是这样,我的类不能共享一个接口。 我需要在接口和类上构建接口。 那么……我该怎么做? 对不起,如果这个问题不那么准确。 不确定如何表达我的确切问题。

可以拥有一长串if / else或switch

if (item is ChatPacket) { // cast } else if (...) { // cast } else ... 

但是,这可能变得笨拙。

您可能希望重温您的课程设计。 通过使用List ,您有效地表明您不关心派生子节点之间的差异 ,至少在其唯一API方面。

换句话说,如果你的设计是

 class Packet { public void Foo() { } } class ChatPacket : Packet { public void Bar() { } } 

你说你只关心能够访问Foo()

如果您确实关心差异,也许您可​​以通过基础中的抽象或虚拟方法以及子项中的覆盖行为来表达与多态性的差异。 因此,您仍然拥有一组基类,但仍然可以获得每个子项指定的自定义行为。

 class Packet { public virtual void Foo() { } } class ChatPacket : Packet { public override void Foo() { } } 

在这里,你只需要调用Foo() 。 无需铸造。

你可以这样做:

 if (myPacket is LoginPacket) { // Do LoginPacket stuff } else if (myPacket is ChatPacket) { // Do ChatPacket stuff } 

一旦你知道它是否是正确的类型,你可以使用as关键字来强制转换它

 ProcessLoginPacket(myPacket as LoginPacket);