铸造课程

时间:2010-03-01 08:17:01

标签: c# casting polymorphism

我有2个班级:

公共类ClassA

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

我在ClassA使用方法

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

//classA=code...

return classA;
}

我在classB

调用此方法
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)??

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

4 个答案:

答案 0 :(得分:6)

不是 a B. B 是A

(ClassB)something_that_is_A除非是B或其衍生物,否则无法完成。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

ClassB继承ClassA不允许将ClassA对象强制转换为ClassB对象,因为所有ClassA对象都不可避免地ClassB对象。

如果您想知道反序列化对象是否是ClassB对象,可以使用以下代码:

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

ClassB b = a as ClassB;

如果对象不是ClassB实例,则b将为null。否则,您将把您的实例作为ClassB对象。