Могу ли я программно установить тип объекта для команды DirectCast? - PullRequest
0 голосов
/ 17 января 2009

Я помогаю коллеге разработать обработчик ошибок типа «поймать все» для некоторых элементов управления своего приложения. Он хочет передать объект с ошибкой и тип этого объекта, например 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 ]

2 голосов
/ 17 января 2009

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

1 голос
/ 17 января 2009

Вы можете использовать отражение, чтобы извлечь свойство. Кроме того, если вы знаете, что объект всегда является элементом управления, почему бы не привести его к элементу управления, а затем получить свойство Text элемента управления?

Control errorObject = (Control)TargetControl;
MessageBox.Show("Error..."+errorObject.Test));

(извините за код C #, не очень знаком с VB, но должен быть почти таким же.)

0 голосов
/ 22 февраля 2013

Обратите внимание, что если бы не было суперкласса, такого как Control в этом случае, то, что вы ищете, было бы почти идентично версии Option Strict Off TargetControl.Text в том смысле, что класс не определен до во время выполнения.

...