【问题标题】:Casting classes铸造班
【发布时间】:2010-03-01 08:17:00
【问题描述】:

我有 2 节课:

公开课ClassA

公共类 ClassB(来自另一个命名空间):ClassA

我在ClassA使用方法

public static ClassA Deserialize(string path)
{
ClassA classA;

//classA=code...

return classA;
}

我在 B 类调用这个方法

public void DoSomething()
{
ClassB classB=(ClassB)ClassA.Deserialize("c:\directory\file.xml);
}

方法反序列化有效,但我收到无法将 ClassA 转换为 ClassB 的错误。

如何处理?

 public static ClassA DeserializeFromXml(string path)
        {

 XmlSerializer s = new XmlSerializer(typeof(ClassA));
            ClaasA h;

            TextReader r = new StreamReader(path);


                h = (ClassA)s.Deserialize(r);

                r.Close();

                return h;
}

也许是反序列化(字符串路径,类型 objectType)?

如果需要,我可以更改方法反序列化

【问题讨论】:

  • 请在 Deserialize() 中提供代码 如果您使用 classA 构造函数创建 ClassA 对象的实例,您肯定会在运行时出错
  • idea with string path, Type objectType 不对?

标签: c# casting polymorphism


【解决方案1】:

A 不是 B。B A

(ClassB) something_that_is_A 不能做,除非它是 B 或其派生词。

【讨论】:

    【解决方案2】:

    如果不显示您的 Deserialize 代码,很难说出发生了什么。这可能是问题的核心——如果您希望能够将结果转换为ClassB,则需要使Deserialize 实际上创建ClassB(或派生类)的实例。如果您的 Deserialize 方法创建了一个 ClassA 实例,然后设置了一堆属性,那么您需要更改它或稍后找到另一种创建 ClassB 实例的方法。

    如果值是对ClassB 实际实例的引用,则只能将表达式转换为ClassB。如果对象只是ClassA 的一个实例,那么您将无法进行转换——您希望ClassB 中的任何额外字段等会发生什么?除非是用户定义的转换,否则对引用类型的转换只会执行 引用转换 - 它不会创建新对象。 (详情请参阅Eric Lippert's blog post on representation and identity。)

    【讨论】:

      【解决方案3】:

      您的方法返回一个 void,因此您尝试将 void 的返回转换为 ClassB。

      【讨论】:

        【解决方案4】:

        ClassB 继承自ClassA 不允许将ClassA 对象转换为ClassB 对象,因为并非所有ClassA 对象都不可避免地是ClassBobjects。

        如果你想知道你的反序列化对象是否是 ClassB 对象,你可以使用这个代码:

        ClassA a = ClassA.Deserialize("c:\directory\file.xml");
        
        ClassB b = a as ClassB;
        

        如果对象不是ClassB 实例,b 将为空。否则,您将拥有您的实例作为 ClassB 对象。

        【讨论】:

          猜你喜欢
          • 2011-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-16
          相关资源
          最近更新 更多