Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Несомненно, но myvalue
должен будет быть определен с типа Object
, и Вы не обязательно хотите это. Возможно, это - случай, лучше подаваемый дженериками.
, Что определяет, какой тип будет использоваться?
Это - самый короткий способ сделать это. Я протестировал его с несколькими типами.
Sub DoCast(ByVal something As Object)
Dim newSomething = Convert.ChangeType(something, something.GetType())
End Sub
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
Это - немного hacky, но это работает.
Возможно, вместо того, чтобы динамично бросить что-то (который, кажется, не работает) Вы могли использовать отражение вместо этого. Достаточно легко получить и вызвать определенные методы или свойства.
Dim t As Type = testObject.GetType()
Dim prop As PropertyInfo = t.GetProperty("propertyName")
Dim gmi As MethodInfo = prop.GetGetMethod()
gmi.Invoke(testObject, Nothing)
Это не симпатично, но Вы могли сделать часть этого в одной строке вместо так многих.
Ну, как Вы определяете, какой тип требуется? Как Joel сказал, это - вероятно, случай для дженериков. Вещь: так как Вы не знаете тип во время компиляции, Вы не можете рассматривать значение, возвращенное так или иначе настолько бросающий, действительно не имеет смысла здесь.