Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Создание переменной разных типов от условия


Автор: U237 27.11.2008, 14:03
Возникла вот такая проблема.
Метод занимается динамическим созданием меню и через рекурсию хочется создать подменю. 
Код

private void CreatMenu(XmlNode node, Menu myMenu)

Собственно код создания идентичен, но если это подменю то второй параметр должен иметь тип MenuItem.
Я пытался в качестве второго параметра передать обьект object myObj. 
А в коде определить какой у него тип и преобразовать именно к этому типу.
Код

if (null != myObj as Menu) 
       Menu myMenu2 = (Menu)myObj;
else
       MenuItem myMenu2 = (MenuItem)myObj;                


Пока все нормально, но как только я хочу использовать myMenu2 VS выдает ошибку "Cannot resolve symbol ...".

Автор: rooks 27.11.2008, 20:35
Цитата(U237 @ 27.11.2008,  14:03)
myMenu2 VS выдает ошибку "Cannot resolve symbol ...".
Ну так myMenu2 определяется внутри блока if else. Вот снаружи его и не видно.
Кстати и Menu и MenuItem наследуются от ItemsControl, так что в теории можно обойтись без приведения типов.

Автор: Partizan 27.11.2008, 21:07
Цитата

Код

if (null != myObj as Menu) 



Эта конструкция заменяется на более красивое

Код

if (myObj is Menu) 

Автор: U237 28.11.2008, 17:43
Всем спасибо!
Пришлось выполнять проверку и приведение типов два раза.
Код

 if (myObj is Menu){
   Menu myMenu2 = (Menu) myObj;
   myMenu2.Items.Add(new Separator());
}else{
   MenuItem myMenu2 = (MenuItem)myObj;
   myMenu2.Items.Add(new Separator());
}
//...
if (myObj is Menu)
{
   Menu myMenu2 = (Menu)myObj;
   myMenu2.Items.Add(myMenu);
}else{
   MenuItem myMenu2 = (MenuItem)myObj;
   myMenu2.Items.Add(myMenu);
}

Не красиво зато работает. Я понимаю что разделитель в основном меню это нереально но тут важен сам принцип.

Автор: Partizan 28.11.2008, 17:53
U237, 

Код

 if (myObj is ItemsControl){
   ItemsControl myMenu2 = (ItemsControl) myObj;
   myMenu2.Items.Add(new Separator());
}


Добавлено @ 17:54
U237, зачем нужны проверка и приведение 2 раза - тоже не понятно...

Автор: U237 30.11.2008, 02:29
Между двумя проверками есть код да и проверка выполняется в разных ветках кода.
В первом случае мы добавляем разделитель во втором подменю и то и другое может быть и в основном меню (Menu) и  в подменю (MenuItem). Вариант с  (ItemsControl) у меня не сработал, названия меню не отображаются.
Конечно это можно сделать немного красивей например так:
Код

if (myObj is Menu)
   ((Menu)myObj).Items.Add(new Separator())
else
   ((MenuItem)myObj).Items.Add(new Separator());


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)