2009-12-23 2 views
-1

Этот код является представлением моей логики. Очевидно, что это не сработает. Пожалуйста, сообщите, как это сделать.Как преобразовать в определенный тип, если исходный тип неизвестен?

switch (ObjectToControl.GetType().ToString()) 
{ 
    case "DataList": 
     DataList Controled = (DataList)ObjectToControl; 
     break; 
    case "DetailsView": 
     DetailsView Controled = (DetailsView)ObjectToControl; 
     break; 
    case "FormView": 
     FormView Controled = (FormView)ObjectToControl; 
     break; 
    case "ListView": 
     ListView Controled = (ListView)ObjectToControl; 
     break; 
    default: 
     GridView Controled = (GridView)ObjectToControl; 
     break; 
} 
+3

Что вы делаете с «Контролируемым» после переключения? – Elisha

+0

Комментарий Элиши очень уместен. Ответ на это сильно зависит от того, что вы планируете делать после конверсии. – jason

ответ

0

Если исходный тип неизвестен и не может быть обнаружен, то действительного преобразования вы не сможете сделать. Сказав это, этого никогда не должно было случиться.

Как ObjectToControl.GetType().ToString() возвращает полное имя класса, поэтому ваш код всегда будет попадать в корпус default в его нынешнем виде.

Можете ли вы уточнить характер вашей проблемы? Является ли это время компиляции или время выполнения?

1

заменить

ObjectToControl.GetType() 

с

ObjectToControl.GetType().Name 

, если это то, что вы пытаетесь сделать.

+0

Пока не появится 'CompletelyDifferent.DataList'. –

0

ObjectToControl.GetType(). ToString() вернет пространство имен + имя класса. Возможно, поэтому у вас нет хитов в вашем коммутаторе.

1

GetType(). ToString() возвращает полностью квалифицированное пространство имен. «ListView» будет возвращен как «System.Windows.Forms.ListView».

3

Зачем конвертировать его вообще?

Все эти типы наследуются от Control. Просто введите возвращаемое значение метода как «Управление» и переведите объект в «Управление».

return ObjectToControl as Control; 

Если где-то еще, вам нужно выполнить функциональные возможности, которые только один из перечисленных типов могут работать, то в что точки, в , что метод проверки, чтобы гарантировать, что надлежащий типа перед заливкой и вызова методов, которые существуют только на конкретном типе ..

if (objecttoControl is TypeToCheck) 
     (objecttoControl as TypeToCheck).[MethodName](parameters); 

или ..

TypetoCheck myObj = objecttoControl as TypeToCheck; 
    if(myObj != null) myObj.[MethodName](parameters); 

Первый подход предпочтительнее, если существует большая вероятность получить объекты, которые не являются экземплярами TypeToCheck (как в случае с этим положением). Второй подход лучше, когда ситуация такова, что вы ожидаете только экземпляры TypeToCheck, чтобы добраться до этой строки кода ...

1

Попробуйте это:

object Controled = null; // Default is that we don't know what this is 
    if (ObjectToControl is DataList) 
     Controled = ObjectToControl as DataList; 
    else if (ObjectToControl is DetailsView) 
     Controled = ObjectToControl as DetailsView; 
    else if (ObjectToControl is FormView) 
     Controled = ObjectToControl as FormView; 
    else if (ObjectToControl is ListView) 
     Controled = ObjectToControl as ListView; 
    else if (ObjectToControl is GridView) 
     Controled = ObjectToControl as GridView; 
1

Другой способ сделать это с помощью " это»ключевое слово:

if(ObjectToControl is DataList) 
{ 
    DataList Controled = (DataList)ObjectToControl; 
    //Do something specific to your data list 
} 
else if(ObjectToControl is DetailsView) 
{ 
    DetailsView Controled = (DetailsView)ObjectToControl; 
    //Do something specific to your details view 
} 
//etc 

Это, как правило, код запах подразумевающую у вас есть проблемы с вашим дизайном, хотя, если вы не знаете типа класса фронта.

+0

Не работает; «Контролируемый» выходит из области действия после блоков 'if'. – Zano

+0

True - исправлено. – Paolo

1

Try таким образом

if (ObjectToControl is CheckBox){ 

    ((CheckBox)ObjectToControl).IsChecked = true; 
    //Code Here 
} 

else if (ObjectToControl is Textbox){ 

    //Code Here 
} 

Это позволит избежать путаницы имен.