数组中的不同类型,如何在将它们从数组中取出时知道将它们转换为什么?
假设类型为Packet的通用List ,包含扩展Packet的自定义类,例如LoginPacket或ChatPacket 。
假设我将这些放在列表中。 当我拿出它们时,每个最“特定”的类型是Packet 。 我想把它们转换成更具体的类型,然后回到原来的LoginPacket或ChatPacket,或者回到原来的类型。
问题:我该怎么办?
参考: 如何在运行时以编程方式转换对象?
所以…似乎这些自定义类共享一个通用接口,它会解决转换问题吗? 但如果是这样,我的类不能共享一个接口。 我需要在接口和类上构建接口。 那么……我该怎么做? 对不起,如果这个问题不那么准确。 不确定如何表达我的确切问题。
你可以拥有一长串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
关键字来强制转换它
上述就是C#学习教程:数组中的不同类型,如何在将它们从数组中取出时知道将它们转换为什么?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
ProcessLoginPacket(myPacket as LoginPacket);
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/952182.html