Почему нельзя использовать GetType при кастинге?

Я спросил еще вопрос без ответа, который прольет больше света на этот вопрос.

Почему я не могу сделать это...

_wizardDialog.UIRoot.Controls.Clear()
_wizardDialog.UIRoot.Controls.Add(TryCast(wizardUserControl, wizardUserControl.GetType))

Почему использование GetType таким образом не работает. Аргументом для try cast являются объект и тип. Поскольку wizardUserControl.GetType возвращает тип, почему это недопустимо. Visual Studio жалуется, что wizardUserControl.GetType не определен.

Суть в том, как я могу заставить WizardUserControl возвращать тип, который передается моему методу. Метод, который вызывается здесь, не должен иметь жестко запрограммированный тип... в этом смысл всего этого ООП... верно? Итак, как вы это делаете.

Пожалуйста, прочитайте другой вопрос и ответьте там, если можете... это проблема, которую я пытаюсь решить.

Я изучаю oop материал.

Сет


person Seth Spearman    schedule 27.07.2009    source источник


Ответы (3)


Подумайте об этом таким образом::

  • GetType() — это функция. Он возвращает объект.

    • You do not know what the type is, or you wouldn't need to ask :)
  • Когда вы приводите объект, вы сообщаете КОМПИЛЯТОРУ, каков его тип.

Вы не можете одновременно спрашивать тип, что это такое, что происходит во время выполнения, и сообщать компилятору, что это такое во время компиляции, в одном и том же месте.

Я думаю, вы также можете думать о чем-то вроде GetType(String) как о ключевом слове. В этом примере понятнее:

  // Makes sense, we tell the compiler what the object is.  We could still get a 
  // *runtime* exception, if we were lying to the compiler.
  Dim car = CType(vehicle, Car); 

  // this doesn't make sense, since we don't know what is in "anObj"
  Dim anObj As Object = "(I don't know what it is, thats why it's an object)"
  Dim car = ctype(anObj, anObj.GetType() )

  // and this is the clearest, in vb.  you can see the type is being used kinda like
  // a keyword.  it won't change, but a call to GetType could
  If TypeOf anObj is Car Then
   ...

Во втором случае вы не знаете, что такое "anObj". С

person Andrew Backer    schedule 27.07.2009

GetType() не возвращает тип. Он возвращает экземпляр класса Type, который описывает тип во время выполнения. Однако экземпляр Type не заменяется там, где ожидается ссылка на тип времени компиляции (например, TryCast). Это просто разные вещи.

Подумайте об этом таким образом. TryCast имеет определенный тип результата времени компиляции. Если вы используете объект Type, полученный откуда-то еще (и он может быть условным с Random, так что вообще нет возможности предсказать результат во время компиляции), то каким должно быть время компиляции тип результата TryCast?

person Pavel Minaev    schedule 27.07.2009

Нет абсолютно ничего плохого в том, чтобы «жестко закодировать» тип в вашем коде. Общая идея ООП-программирования (в частности, идея "программирования для интерфейса") в этом отношении заключается в том, что вы указываете класс, который наиболее обобщенно описывает то, что вам нужно делать. Например, если я пишу код, в котором я добавляю экземпляры UserControl в форму, где все эти экземпляры наследуются от базового класса, и мне нужна функциональность этого базового класса (вашего класса WizardUserControlBase), то это тип, который я будет использовать класс WizardUserControlBase для ссылки на мои элементы управления.

Что касается этого вопроса, ООП не означает отсутствие «жестко закодированных» типов (на каком-то уровне он ДОЛЖЕН быть жестко закодирован, даже если это просто Object, поскольку это все еще класс). Несмотря на это, я не совсем уверен, чего вы пытаетесь достичь (похоже, что вы пытаетесь), приведя его к своему собственному типу. Вы должны просто позвонить _wizardDialog.UIRoot.Controls.Add(wizardUserControl)

person Adam Robinson    schedule 27.07.2009
comment
Спасибо за Ваш ответ. Я понимаю, что в какой-то момент вы должны ссылаться на конкретный тип. Но этот код должен иметь возможность загружать любой тип пользовательского элемента управления, который реализует IWizardUserControl. На данном этапе кода это может быть любое количество реализаций. Итак, я имел в виду, что этот код в InitUserControl не должен иметь жестко запрограммированной ссылки на какую-либо из реализаций IWizardUserControl. ЭТО побеждает цель ООП. Кстати, _wizardDialog.UIRoot.Controls.Add(wizardUserControl) — это неработающий код, который у меня был. Сет - person Seth Spearman; 28.07.2009