gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:44:58 26 4
gpt4 key购买 nike

假设有一个 Packet 类型的通用 List,包含扩展 Packet 的自定义类,例如 LoginPacket 或 < strong>ChatPacket.

假设我将这些放在列表中。当我将它们取出时,最“具体”的类型是数据包。不过,我想将它们转换成它们更具体的类型,回到它们原来的 LoginPacketChatPacket 或者回到它们原来的类型。

问题:我该怎么做?

引用:How to cast an object programmatically at runtime?

所以...如果这些自定义类共享一个公共(public)接口(interface),似乎就可以解决转换问题?但如果是这样,我的类就不能共享一个接口(interface)。我需要在接口(interface)之上构建接口(interface),在类之上构建类。那么...我该怎么做?抱歉,如果这个问题不是那么准确。不确定如何阐明我的确切问题。

最佳答案

可以有一长串 if/else 或 switch

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

但是,这可能会变得笨拙。

您可能希望重新审视您的类(class)设计。通过拥有 List<Packet> ,您实际上是在声明您不关心派生子项之间的差异,至少在它们独特的 API 方面是这样。

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

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

您是说您只关心能够访问 Foo() .

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

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

在这里,您只需调用 Foo() .无需类型转换。

关于c# - 数组中的不同类型,如何知道将它们从数组中取出时将它们转换为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6515460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com