2013-03-06 14 views
9

W VB.NET CT można wykorzystać do konwersji jednego typu na inny.CType w VB.NET z dynamicznym drugim parametrem (typ)

CType(expression,type) 

Mam "wyrażenie" przechowywane w klasie obiektu instancji, na przykład "objExp". Mam "typ" przechowywane w wystąpienie klasy Type, na przykład "objType".

Próbuję CType(objExp, objType) Dostaję błąd kompilacji, jak powinienem to zrobić? "objType" jest pobierane i przypisywane w czasie wykonywania.

+0

'CType' służy do poinformować kompilator, jaki typ obiektu jest, więc' 'type' expression' i musi być znany w czasie kompilacji ** **. Jakiego błędu dostałeś w ogóle? –

+0

I GDZIE będzie przechowywał wynik, jeśli jest nieznany, aż do uruchomienia? W przypadku tego rodzaju konwersji można po prostu polegać na ** System.Convert.ChangeType **. Czy to kolejny problem XY? –

+0

@ TimSchmelter, błąd jest "Typ" objType "nie jest zdefiniowany" – Brij

Odpowiedz

1

To jest po prostu niemożliwe. Wyrażenie CType muszą być przekazywane do Type instancji, który jest znany w czasie kompilacji, jak IntegerString, etc ... To nie przyjmuje wartości, które są typu Type

0

Jeśli nie ma sensu rzucać obiektu do typ zmiennej (typ nieznany w czasie kompilacji). Cały punkt rzucania polega na określeniu dokładnego typu. Podejrzewam jednak, że zamiast używać obiektu Type, naprawdę potrzebna jest metoda generyczna lub klasa generyczna. Na przykład:

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

To metoda naprawdę bezcelowe, ponieważ wszystko, co robi jest odlewana własności i zwraca go jako tego typu, ale to pokazuje, jak można rzucić wpisać T nie wiedząc, co konkretnie T dzieje być. Następnie można nazwać tak:

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

To jest dokładnie jak klasa List(Of T), i inne podobne klasy generyczne są realizowane. Z wyjątkiem, zamiast tworzyć indywidualny sposób ogólny, oni sprawiają, że cała klasa rodzajowy, na przykład:

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

Jak to się zasadniczo różni od CType (x, MyType2)? Więcej pisania - ten sam wynik. Zarówno w generycznych i CType typ musi być znany w czasie kompilacji. – Neolisk

+1

@Neolisk, masz rację, nawet w czasie kompilacji typ musi być znany dla typu ogólnego, ale typ jest określony przez wywołującego, a nie w samej metodzie ogólnej. Jak powiedziałem w odpowiedzi, przykładowa metoda, którą pokazałem, była bezcelowa. Miało to jedynie pokazać, jak działają rodzaje ogólne. –

16

Szukały do ​​metody CTypeDynamic()? Drugi parametr (np. Typ) można ustawić dynamicznie. Świetne, gdy używasz Reflection.

Na przykład:

CTypeDynamic(strValueToConvert, objTypeToConvertTo) 
+1

Ta odpowiedź działa dla mnie. Jak to nie jest najlepsza odpowiedź? – Arvin

+1

Cóż, z jednego powodu, typem zwrotu 'CTypeDynamic' jest' Object', co jest niefortunne, ale oczywiście nieuniknione. –

+0

Działa idealnie! – HumbleBeginnings