Могу ли я программно установить тип объекта для команды DirectCast?
Я помогаю коллеге разработать обработчик ошибок типа "поймать все" для некоторых элементов управления своего приложения. Он хочет передать объект с ошибкой и тип этого объекта, например TextBox или ComboBox, а затем вызвать метод DirectCast в своем обработчике, чтобы должным образом обратиться к атрибуту Text внутри него. В общем, метод выглядит так:
Protected Sub SpecialErrorHandler(ByVal TargetControl As Object, ByVal ControlType As String)
MessageBox.Show("Bad Juice: " & DirectCast(TargetControl, ControlType(ObjType)).Text)
End Sub
До сих пор любые попытки выполнить преобразование типа в методе DirectCast (так как он ожидает объект в общей сигнатуре) или даже передать правильно установленный объект Type, не работают.
Любые идеи здесь, или это одна из тех, "Кастинг не работает таким образом". тип сценариев?
3 ответа
DirectCast()
нужен реальный тип во время компиляции, поэтому он знает, как выглядит результат вызова. Лучшее, на что вы можете надеяться, это привести общий базовый тип для каждого из ожидаемых объектов. В этом случае вам повезло иметь достаточно полезный базовый тип: Control
,
Вы можете использовать отражение, чтобы извлечь свойство. Кроме того, если вы знаете, что объект всегда является элементом управления, почему бы не привести его к элементу управления, а затем получить свойство Text элемента управления?
Control errorObject = (Control)TargetControl;
MessageBox.Show("Error..."+errorObject.Test));
(извините за код C#, не очень знакомый с VB, но должен быть почти таким же.)
Обратите внимание, что если бы не было суперкласса, как Control
в этом случае то, что вы ищете, будет почти идентично Option Strict Off
версия TargetControl.Text
в том, что класс не определяется до времени выполнения.