Кастинг-классы - PullRequest
       16

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

0 голосов
/ 01 марта 2010

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

Ответы [ 4 ]

6 голосов
/ 01 марта 2010

A не a B. B - это a

(ClassB) что-то, что не может быть сделано, если оно не является B или его производной.

2 голосов
/ 01 марта 2010

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

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

1 голос
/ 01 марта 2010

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

0 голосов
/ 01 марта 2010

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

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

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

ClassB b = a as ClassB;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...