Кастинг в VB.NET - PullRequest
       32

Кастинг в VB.NET

14 голосов
/ 30 октября 2008

Я хотел бы иметь возможность динамически приводить значение, если тип известен только во время выполнения. Примерно так:

myvalue = CType(value, "String, Integer or Boolean")

Строка, содержащая значение типа, передается в качестве аргумента и также считывается из базы данных, а значение сохраняется в виде строки в базе данных.

Возможно ли это?

Ответы [ 5 ]

9 голосов
/ 30 октября 2008
 Dim bMyValue As Boolean
 Dim iMyValue As Integer
 Dim sMyValue As String 
 Dim t As Type = myValue.GetType


 Select Case t.Name
     Case "String"
        sMyValue = ctype(myValue, string)
     Case "Boolean"
        bMyValue = ctype(myValue, boolean)
     Case "Integer"
        iMyValue = ctype(myValue, Integer)
 End Select

Это немного глупо, но работает.

7 голосов
/ 30 октября 2008

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

Что определяет, какой тип будет использоваться?

5 голосов
/ 30 октября 2008

Это самый короткий способ сделать это. Я проверил это с несколькими типами.

Sub DoCast(ByVal something As Object)

    Dim newSomething = Convert.ChangeType(something, something.GetType())

End Sub
4 голосов
/ 30 октября 2008

Ну, как вы определяете, какой тип требуется? Как сказал Джоэл, это, вероятно, случай для дженериков. Дело в том, что поскольку вы не знаете тип во время компиляции, вы все равно не можете обработать возвращаемое значение, поэтому приведение не имеет смысла.

2 голосов
/ 30 октября 2008

Возможно, вместо динамического приведения чего-либо (что, похоже, не работает), вы могли бы вместо этого использовать отражение. Достаточно легко получить и вызвать определенные методы или свойства.

Dim t As Type = testObject.GetType()
Dim prop As PropertyInfo = t.GetProperty("propertyName")
Dim gmi As MethodInfo = prop.GetGetMethod()
gmi.Invoke(testObject, Nothing)

Это не красиво, но вы можете сделать это в одной строке вместо многих.

...