Кастинг в VB.NET

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

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

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

Это возможно?


person Youssef    schedule 30.10.2008    source источник


Ответы (5)


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

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

person Joel Coehoorn    schedule 30.10.2008
comment
просто строка, указывающая тип String, integer, boolean - person Youssef; 30.10.2008
comment
строка передается как аргумент - person Youssef; 30.10.2008
comment
и значение хранится в виде строки в БД - person Youssef; 30.10.2008
comment
codeproject.com/KB/dotnet/CheatSheetCastingNET.aspx .. это все, что я нашел по теме - person Tigraine; 30.10.2008
comment
Я выбрал этот ответ, потому что дженерики кажутся более абстрактными и глобальными для других типов. Другие ответы также были действительны от tom.dietrich и от Atkinson. Спасибо всем за вашу помощь. - person Youssef; 30.10.2008
comment
@Youssef: Что вы будете делать с MyValue, когда оно у вас будет? Я мог бы легко написать метод, который ВЫБИРАЕТ (подсказывает) правильное приведение, но он должен будет принимать и возвращать объект, поэтому от него будет мало пользы. - person Joel Coehoorn; 30.10.2008
comment
Джоэл: myvalue используется как параметр для проверки в некоторых моих бизнес-функциях. вот так: can_Do_something=Settings.GetValue(логического значения) (UserId, aSettingKey) - person Youssef; 30.10.2008
comment
Хорошо. В этом случае похоже, что код, который использует каждый параметр, знает значение во время компиляции. Это делает вещи намного проще (похоже, вы узнаете). - person Joel Coehoorn; 31.10.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

Это немного хакерски, но это работает.

person tom.dietrich    schedule 30.10.2008

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

Sub DoCast(ByVal something As Object)

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

End Sub
person Inisheer    schedule 30.10.2008

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

person Konrad Rudolph    schedule 30.10.2008

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

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

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

person Sam Corder    schedule 30.10.2008