铸造类

问题描述:

我有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); 
} 

方法反序列化的作品,但我得到错误,cannont投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)?

我可以改变方法反序列化是否会需要

+0

请提供Deserialize()内部的代码 如果您正在使用classA构造函数创建ClassA对象的实例,您肯定会在运行时得到错误 – Ravisha 2010-03-01 08:27:26

+0

带有字符串路径的想法,Type objectType是错误的? – user278618 2010-03-01 08:44:18

不是一个B.乙的A

(ClassB的)something_that_is_A无法做到的,除非它是一个B或它的衍生物。

没有显示你的Deserialize代码这是相当很难说这是怎么回事。这很可能是问题的核心 - 如果您想要将结果投射到ClassB,您需要使Deserialize实际上创建ClassB(或派生类)的实例。如果您的Deserialize方法创建了一个ClassA的实例,然后设置了一堆属性,则需要更改它或找到另一种方式来创建ClassB实例。

如果该值是对实际实例ClassB的引用,则只能将表达式转换为ClassB。如果对象只是ClassA的一个实例,那么你将无法投射 - 你会期望在ClassB的任何额外字段中发生什么?除非用户定义的转换,否则为参考类型转换仅执行参考转换 - 它不创建新对象。 (有关更多详细信息,请参见Eric Lippert's blog post on representation and identity)。

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

具有ClassAClassB继承不允许ClassA对象被丢在一个ClassB对象,因为所有ClassA的对象不是必然ClassB对象。

如果你想知道,如果反序列化对象是ClassB的对象,你可以使用此代码:如果对象不是ClassB实例

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

ClassB b = a as ClassB; 

,B将是空的。否则,您将将您的实例作为ClassB对象。