#vb.net #visual-studio-2008
#vb.net #visual-studio-2008
Вопрос:
Я разрабатываю vb.net программа с VS2008. В моем случае dt_list является членом экземпляра как список (из одного). Когда я писал
dt_list = CType(ser2.Deserialize(r), dt_list.GetType())
VS2008 жалуется на «Тип»dt_list.GetType()’ не определен.».
Почему? Заранее спасибо.
Комментарии:
1. @Hand-E-Food dt_list является членом экземпляра в виде списка (из одного)
2. Извините, я, по-видимому, совершенно слеп.
Ответ №1:
Причина, по которой это недопустимо, заключается в том, что точное значение типа для GetType()
должно быть определено во время выполнения. Вторым параметром CType может быть только «выражение, допустимое в предложении As в операторе Dim, то есть имя любого типа данных, объекта, структуры, класса или интерфейса», например List(Of String)
, которое может быть определено во время компиляции.
Соответственно, следующее является законным:
dt_list = CType(ser2.Deserialize(r), List(Of Single))
Редактировать:
Однако приведение к произвольному типу, где тип неизвестен во время компиляции, является более сложным. Предлагаемый ответ на этот вопрос на форумах MSDN показывает один подход. Хотя это на C #, я предполагаю, что тот же подход может быть использован в VB.NET как хорошо.
Комментарии:
1. Итак, короче говоря, GetType — это процедура времени выполнения, в то время как CType нужен параметр времени компиляции. Есть ли способ выполнить динамическое приведение?
Ответ №2:
Чего вы пытаетесь достичь, выбирая тип приведения во время выполнения?
Возможно, вы сможете решить свою проблему с помощью интерфейса.
Dim dt_list As IList = Ctype(ser2.Deserialize(r), IList)
Это дает вам доступ ко всем элементам списка в IList.