【问题标题】:Deserialized object type casting at runtime运行时的反序列化对象类型转换
【发布时间】:2012-12-26 13:49:06
【问题描述】:

假设我有这个类层次结构:

public abstract class Base {};
public class Child1 : Base {};
public class Child2 : Base {};

在某些时候,我将一个继承类保留在 IsolatedStorageSettings.ApplicationSettings 中,然后将其作为 object 取回。如何确定它是Child1 还是Child2 并在运行时将其类型转换为正确的类型?

【问题讨论】:

    标签: c# casting windows-phone-8


    【解决方案1】:

    你不能只用 is 吗?

    if(myobject is Child1)
        var child1 = (Child1)myobject;
    else if (myobject is Child2)
        ....
    

    【讨论】:

    • 谢谢,这适用于我的情况,因为我只有两个不变量。但是,假设,如果我根本不知道对象的类型怎么办?有没有更优雅的不涉及if-else枚举的解决方案?
    • @Anton 如果您根本不知道类型,为什么要转换它?您只需将其强制转换为调用特定的属性或方法,这意味着您知道底层类型。
    • @KooKiz 是的,我制定的示例情况很糟糕。然而,问题仍然存在。在我看来if-else 不太优雅。
    • @Anton 如果您需要调用Base 中定义的方法,那么您只需要将您的对象转换为Base,不管它是否是子类型。如果您需要调用Child1Child2 的方法,您将编写一段特定的代码来调用此方法。所以 if/else 变化不大。我看到的唯一麻烦的情况是,如果您的方法同时对Child1Child2 进行了重载:void Method(Child1 obj)void Method(Child2 obj)。对于这种情况,通常的解决方法是使用 dynamic 关键字,遗憾的是 Windows Phone 上不存在该关键字。
    • @KooKiz 确实,你是对的。我的情况是,我需要调用在Base 中定义并在孩子身上重新定义的方法。经过一些研究,现在我发现virtual/override 将解决我的问题,而无需猜测确切的子类型。
    【解决方案2】:

    最简单的方法是使用 as 关键字进行转换并检查结果:

    Base child;
    child = mysteryObject as Child1;
    if(child == null)
    {
        // mysteryObject is Child2
        child = mysteryObject as Child2;
    }
    else
    {
        // mysteryObject is Child1
    }
    

    您也可以使用 is 关键字代替。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 2016-03-30
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      相关资源
      最近更新 更多