Кастинг классы

У меня 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, если бы это было необходимо


person user278618    schedule 01.03.2010    source источник
comment
Пожалуйста, предоставьте код внутри Deserialize () ЕСЛИ вы создаете экземпляр объекта ClassA с конструктором classA, вы обязательно получите ошибку во время выполнения   -  person Ravisha    schedule 01.03.2010
comment
идея со строковым путем, тип objectType неверен?   -  person user278618    schedule 01.03.2010


Ответы (4)


A не B. B это A

(КлассB) something_that_is_A невозможно сделать, если это не B или его производная.

person Preet Sangha    schedule 01.03.2010

Не показывая своего Deserialize кода, довольно сложно сказать, что происходит. Вероятно, это и есть суть проблемы - вам нужно заставить Deserialize фактически создать экземпляр ClassB (или производный класс), если вы хотите иметь возможность преобразовать результат в ClassB. Если ваш Deserialize метод создает экземпляр ClassA, а затем устанавливает набор свойств, вам нужно будет либо изменить его, либо позже найти другой способ создания экземпляра ClassB.

Вы можете преобразовать выражение в ClassB, только если значение является ссылкой на фактический экземпляр ClassB. Если объект является только экземпляром ClassA, тогда вы не сможете выполнить приведение - что вы ожидаете от каких-либо дополнительных полей и т. Д. В ClassB? Если не определено пользователем преобразование, приведение к ссылочному типу выполняет только преобразование ссылки - оно не создает новый объект. (См. Сообщение в блоге Эрика Липперта о представлении и identity для получения более подробной информации.)

person Jon Skeet    schedule 01.03.2010

Ваш метод возвращает void, поэтому вы пытаетесь преобразовать возвращение void в ClassB.

person cjk    schedule 01.03.2010

Наличие ClassB наследования от ClassA не позволяет преобразовать объект ClassA в объект ClassB, поскольку все объекты ClassA не обязательно являются ClassBобъектами.

Если вы хотите узнать, является ли ваш десериализованный объект объектом ClassB, вы можете использовать этот код:

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

ClassB b = a as ClassB;

Если объект не является экземпляром ClassB, b будет нулевым. В противном случае ваш экземпляр будет ClassB объектом.

person Thibault Falise    schedule 01.03.2010