2013-03-06 2 views
9

В VB.NET CType может использоваться для преобразования одного типа в другой.CType в VB.NET с динамическим вторым параметром (тип)

CType(expression,type) 

У меня есть выражение, которое хранится в классе объектов экземпляра, скажем "objExp". У меня есть «тип», который хранится в экземпляре класса типа, например "objType".

Я пытаюсь CType(objExp, objType) Я получаю ошибку компиляции, как мне это сделать? «objType» выбирается и назначается во время выполнения.

+0

'CType' используется, чтобы сообщить компилятору, какой тип объекта является, поэтому' 'expression' и type' должны быть известны ** во время компиляции **. Однако, какую ошибку вы получаете вообще? –

+0

И ГДЕ вы будете хранить результат, если он неизвестен до времени выполнения? Для такого преобразования вы можете просто положиться на ** System.Convert.ChangeType **. Это еще одна проблема XY? –

+0

@TimSchmelter, ошибка: «Тип« objType »не определен» – Brij

ответ

1

Это просто невозможно. Выражение CType должен быть принят Type экземпляр, который известен во время компиляции, как Integer, String и т.д ... Он не принимает значения, которые типа Type

0

Если не имеет смысла, чтобы привести объект к тип переменной (тип, который неизвестен во время компиляции). Вся точка кастинга - это указать точный тип. Я подозреваю, однако, что вместо использования объекта Type вам действительно нужен общий метод или общий класс. Например:

Public Function DoSomethingGenerically(Of T)(MyParameter As MyType) As T 
    Return CType(MyParameter.MyProperty, T) 
End Function 

Это действительно бессмысленно метод, так как все это делает отливают имущество и вернуть его в качестве этого типа, но он показывает, как можно привести к типу T, не зная, что, в частности, T случается быть. Тогда вы могли бы назвать это так:

Dim x As New MyType() 
Dim y As MyType2 = DoSomethingGenerically(Of MyType2)(x) 

Именно как реализуются List(Of T) класс, и другие подобные общие классы. Кроме этого, вместо того чтобы сделать индивидуальный метод общего, они делают весь класс родовое, например:

Public Class MyList(Of T) 
    Public Sub Add(item As T) 
     ' ... 
    End Sub 
End Class 
+0

Как это принципиально отличается от CType (x, MyType2)? Больше ввода - тот же результат. Как в generics, так и в CType тип должен быть известен во время компиляции. – Neolisk

+1

@Neolisk, вы правы, даже во время компиляции тип должен быть известен для общего типа, но тип указан вызывающим, а не самим общим методом. Как я сказал в ответе, примерный метод, который я показал, был бессмысленным. Это было просто предназначено для демонстрации того, как работают типовые типы. –

16

Вы смотрели в метод CTypeDynamic()? Второй параметр (т. Е.: Тип) можно установить динамически. Отлично подходит для использования Reflection.

Например:

CTypeDynamic(strValueToConvert, objTypeToConvertTo) 
+1

Этот ответ работает на меня. Как это не самый главный ответ? – Arvin

+1

Ну, по какой-то причине возвращаемый тип 'CTypeDynamic' является' Object', что является неудачным, но явно неизбежным. –

+0

Работает отлично! – HumbleBeginnings

Смежные вопросы