Как я могу делать кастинг в стиле C в VB.NET? - PullRequest
3 голосов
/ 19 августа 2011

У меня есть переменная типа объекта (control .Tag), которую мне нужно привести к структурированному типу, и изменить член. Это надуманный, но представительный пример:

Public Structure struct_COLOURS
  Dim ILikeRed as boolean
  Dim ILikeGreen as boolean
End Structure

Dim AnObject as Object = (some source that is struct_COLOURS)

DirectCast(AnObject, struct_COLOURS).ILikeRed = True ' This is not valid syntax?!

Я неЯ не очень хорошо помню мой синтаксис C, но это будет примерно так:

(struct_COLOURS*)AnObject->ILikeRed = true;

Дело в том, что я могу привести объект к чему-либо и установить членов в результирующем приведении.Кажется, что DirectCast на самом деле является функцией, а не приведением в том виде, в каком я ее интерпретирую.

Как ни странно, если вы хотите получить только значение члена, вы можете использовать DirectCast:

dim YummyRed AS Boolean = DirectCast(AnObject, struct_COLOURS).ILikeRed

просто отлично!

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

Ответы [ 2 ]

7 голосов
/ 19 августа 2011

Кажется, что DirectCast на самом деле является функцией и не преобразуется так, как я бы ее интерпретировал.

Нет, это неправильно: DirectCast не метод,это реальная языковая конструкция, подобная приведению в C.

Однако , если вы сохраняете структуру (= ​​тип значения) в объекте, она получает в штучной упаковке и, как следствие, скопировано .Это вызывает проблему: вы пытаетесь изменить копию, а не исходный упакованный объект.

Итак, чтобы изменить член объекта типа в штучной упаковке, вам нужно скопировать объект,измените его значение и скопируйте его обратно:

Dim tmp = DirectCast(AnObject, struct_COLOURS)
tmp.ILikeRed = True
AnObject = tmp

Кстати, то же самое относится и к C #, несмотря на поверхностное сходство с синтаксисом преобразования C.

0 голосов
/ 19 августа 2011

Вот как вы должны разыграть - с помощью CType:

Dim myColor As Object = Nothing
        Dim color As Color = CType(myColor, Color)
        color.Name = "red"

Почему структура, а не класс?

...