我是一名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#中无法轻松完成任务,所以有点沮丧。)
答案 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本身一样非常好!
约翰威格尔