这个C#FluentNHibernate组件映射的等效VB.NET代码是什么?

时间:2010-02-04 16:54:27

标签: vb.net nhibernate fluent-nhibernate nhibernate-mapping c#-to-vb.net

我是一名C#程序员,只能编写VB.NET代码。

在为我当前的客户进一步探索NHibernate时,我遇到了FluentNHibernate,我发现它真的很有吸引力。

但是现在,我想知道如何将用于组件映射的C#代码“转换”为VB.NET代码:

Component(x => x.Address, m =>
{
    m.Map(x => x.Number);
    m.Map(x => x.Street);
    m.Map(x => x.PostCode);
});

我从这里知道:

Component(Of Client)(Function(c) c.Address, ...)

我想念的是如何继续使用VB.NET中的括号,因为没有Begin End关键字。

  

编辑1:遵循JaredPar先生的指示,我认为他的解决方案可能有效。如果我们花时间阅读他的答案,我们可能会注意到我们都不知道他的解决方案中的MType是什么。我可能已经发现MType是:

FluentNHibernate.Mapping.ComponentPart(Of TComponent)
  

因此,根据我的理解,TComponent是一个我将参数使用的匿名类型。从这个角度来看,由于我希望映射我的Address对象的属性,所以在我的帮助方法签名中替换TComponent似乎不起作用。

Private Sub MapAdresseHelper(Of Adresse)(ByVal a As FluentNHibernate.Mapping.ComponentPart(Of Adresse))
    a.Map(Function(m) m.Number)
    a.Map(Function(m) m.Street).Length(50)
    a.Map(Function(m) m.PostCode).Length(10)
End Sub

我得到的错误是我的Address类没有名为Street的属性成员。它看到了我的地址类型,它识别它,但它似乎有些错误。我猜VBNET的lambda表达式设计很差,并且比C#演变得少(对不起,由于使用它的约束而且在C#中无法轻松完成任务,所以有点沮丧。)

3 个答案:

答案 0 :(得分:3)

在Visual Basic 2010中,您可以编写以下内容

Component(Function(x) x.Address, Sub(m)
  m.Map(Function(x) x.Number)
  m.Map(Function(x) x.Street)
  m.Map(Function(x) x.PostCode)
  End Sub)

修改

这是VS2008风格的解决方案。我不熟悉FluentNHibernate,所以我不知道M的类型是什么,但你应该能够用它的类型替换MType并且代码工作正常。

Private Sub Helper(ByVal m As MType)
  m.Map(Function(x) x.Number)
  m.Map(Function(x) x.Street)
  m.Map(Function(x) x.PostCode)
End Sub

...  
Component(Function(x) x.Address, AddressOf Helper)

答案 1 :(得分:1)

您无法在VB.Net中执行多行lambda表达式。我相信VB.Net 2010将解决这个问题。你能不能只用C#创建一个dll然后从VB.Net调用它?

答案 2 :(得分:0)

威尔   我对.NET 3.5 / VS 2008的编译器中的lambdas的VB.NET实现感到沮丧。实际上并不是说语言设计不合适的lambdas,只是实现不完整。 NET 3.5。 Lambda支持涉及许多编译器技巧,无法在2008版本所需的时间范围内完成。我想指出,您可以继续使用VS 2010来定位当前的.NET框架版本,并获得VS 2008编译器提供的对lambda的完整支持。这意味着您可以使用多行lambdas和匿名Sub(以完成以前的现有匿名函数),从而允许Action <T>正常工作。您还可以避免在muitiline代码语句中使用下划线字符。当直接使用lambdas,流畅的API或LINQ时,这非常方便。希望这可以帮助您向客户提出强有力的论据,以升级您的编译器版本,而不会带来重大更改的风险。除了非常缺乏对迭代器块的支持之外,VS 2010中的VB.NET实现与基于WPF的Visual Studio本身一样非常好!    约翰威格尔