Утилита преобразования С# в VB.Net, которая правильно обрабатывает автоматические свойства?

Я надеюсь, что это не считается дубликатом, поскольку он более точен, чем аналогичные вопросы (мне любопытна конкретная слабость в утилитах преобразования С# в VB.net).

Я рассматривал возможность использования такого инструмента, как этот преобразователь кода .net для преобразования библиотеки классов в VB, так как я единственный в моей группе, которому удобно работать с C#. Проблема, с которой я столкнулся, заключается в том, что он не генерирует правильный VB для автоматических свойств. Он создает пустые процедуры получения/установки.

Итак, это:

public string TransactionType { get; private set; }

Становится так:

Public Property TransactionType() As String
    Get
    End Get
    Private Set(ByVal value As String)
    End Set
End Property

Инструменты, связанные здесь и здесь имеют аналогичные проблемы - некоторые создают допустимые свойства, но они не учитывают уровень доступа установленной процедуры.

Дополнительный вопрос. Если бы вы собирались исправить конвертер на DeveloperFusion, вы бы вернули что-то вроде этого?

Private _TransactionType As String
Public Property TransactionType() As String
    Get
        Return _TransactionType
    End Get
    Private Set(ByVal value As String)
        _TransactionType = value
    End Set
End Property

person Peter T. LaComb Jr.    schedule 06.10.2008    source источник
comment
Почему, если остальная часть команды пишет код на VB, вы пишете НЕ на VB, а на C#?   -  person MagicKat    schedule 06.10.2008
comment
Потому что мы пишем в совершенно разных проектах. Каким-то образом работа, которой я занимаюсь, подходит для того, чтобы 5-10 человек писали отдельные программы, а не чтобы мы все работали над одним большим приложением.   -  person Peter T. LaComb Jr.    schedule 26.12.2008


Ответы (5)


Теперь мы обновили генератор кода для поддержки этого сценария. Если вы заметите какие-либо другие, которые у нас не очень хорошо, пожалуйста, напишите мне.

person James Crowley    schedule 03.11.2008

Я бы рекомендовал скомпилировать код и использовать что-то вроде отражателя Red-Gate http://www.red-gate.com/products/reflector/index.htm для обработки преобразования. Теперь он не «идеален», и я не уверен, что он обрабатывает автоматические свойства (хотя я полагаю, что он будет).

Что делает это возможным, так это то, что когда вы компилируете язык .NET до IL, они точно такие же. Язык — это просто еще один слой поверх этого. Таким образом, 2 свойства, которые выглядят одинаково на своих родных языках, компилируются в один и тот же код IL. Таким образом, изменить это на другие языки, используя что-то вроде Reflector, легко и быстро.

person Chad Moran    schedule 06.10.2008

Я наткнулся на это, когда искал способ автоматизировать использование рефлектора для перевода кода (поскольку для него есть несколько плагинов для генерации кода на других языках (даже PowerShell)), но вы заставили меня задуматься, поэтому я попробовал. Если для совместимости установлено значение .Net 3.5, он преобразует ваш пример в это:

Property TransactionType As String
  Public Get
  Private Set(ByVal value As String)
End Property

Если вы копаетесь, он сообщает, что существуют методы, сгенерированные компилятором, которые он не экспортирует в VB.Net или C# с совместимостью 3.5 на... ОДНАКО, если вы переключите его на 2.0, тот же код сгенерирует это:

Property TransactionType As String
    Public Get
        Return Me.<TransactionType>k__BackingField
    End Get
    Private Set(ByVal value As String)
        Me.<TransactionType>k__BackingField = value
    End Set
End Property

<CompilerGenerated> _
Private <TransactionType>k__BackingField As String

P.S.: если вы попытаетесь использовать дизассемблер, такой как Reflector, для генерации кода, не забудьте сохранить файл .pdb, чтобы вы получили правильные имена для переменных;)

person Jaykul    schedule 16.10.2008

В качестве ответа на ваш побочный вопрос: да, этот код в значительной степени именно то, что я заставлю его создать. Вы не можете заставить его делать именно то, что делает код C#, то есть сделать имя переменной «невыразимым» (т. е. невозможным для ссылки в коде), но это, вероятно, достаточно близко.

person Jon Skeet    schedule 06.10.2008

Я бы посоветовал проверить SharpDevelop (иногда пишется как #develop). Это .NET IDE с открытым исходным кодом, который, помимо прочего, может конвертировать (с некоторыми проблемами) из C # в VB.NET и наоборот.

person theraccoonbear    schedule 06.10.2008