3

我希望这不会被认为是重复的,因为它比类似的问题更尖锐(我很好奇 C# 到 VB.net 转换实用程序的特定弱点)。

我一直在考虑使用像这样的.net 代码转换器之类的工具将类库转换为 VB,因为我是我小组中唯一一个熟悉 C# 的人。我遇到的问题是它没有为自动属性生成正确的 VB。它创建空的 get/set 例程。

所以这:

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
4

5 回答 5

4

我们现在更新了代码生成器以支持这种情况。如果您发现其他我们做得不好的地方,请给我留言。

于 2008-11-03T15:43:52.067 回答
2

我建议编译代码并使用 Red-Gate 的反射器http://www.red-gate.com/products/reflector/index.htm之类的东西来处理转换。现在它不是“完美的”,我不确定它是否处理自动属性(尽管我想它会)。

使这成为可能的是,当您将 .NET 语言编译为 IL 时,它们完全相同。语言只是在此之上的另一层。因此,在其本机语言中看起来相同的 2 个属性编译为完全相同的 IL 代码。因此,使用 Reflector 之类的东西将其转换为其他语言既简单又快捷。

于 2008-10-06T15:08:57.400 回答
2

我在寻找一种使用反射器自动翻译代码的方法时偶然发现了这一点(因为它有几个插件可以生成其他语言的代码(甚至是 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

PS:如果您尝试使用像 Reflector 这样的反汇编程序来生成代码,请记住保留 .pdb 文件,以便获得变量的正确名称;)

于 2008-10-16T16:57:26.180 回答
1

作为对您的附带问题的回答:是的,该代码几乎正是我要生成的代码。您无法让它完全按照 C# 代码所做的那样做,即使变量的名称“不可描述”(即无法在代码中引用),但这可能已经足够接近了。

于 2008-10-06T15:16:43.500 回答
1

我建议查看SharpDevelop(有时写为#develop)。它是一个开源 .NET IDE,除其他外,它可以将(有一些问题)从 C# 转换为 VB.NET,反之亦然。

于 2008-10-06T15:17:05.980 回答