Каким будет эквивалентный код VB.NET для этого сопоставления компонентов C # FluentNHibernate? - PullRequest
4 голосов
/ 04 февраля 2010

Я программист на 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: Следуя инструкциям г-на ДжаредПара, я решил, что его решение может сработать. Если мы потратим время, чтобы прочитать его ответ, мы можем заметить, что мы оба не знаем, что такое 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 плохо спроектирован для лямбда-выражений и менее развит, чем C # (извините, немного разочарован из-за ограничений работы с ним и неспособности делать вещи ОЧЕНЬ легко в C #.)

Ответы [ 3 ]

3 голосов
/ 04 февраля 2010

В 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)

EDIT

Вот решение в стиле 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 голос
/ 04 февраля 2010

Вы не можете делать многострочные лямбда-выражения в VB.Net. Я верю, что VB.Net 2010 исправит это. Можете ли вы не просто создать DLL в C #, а затем вызвать его из VB.Net?

0 голосов
/ 14 марта 2010

Will, Я разделяю ваше разочарование в связи с реализацией лямбда-выражений в VB.NET как с компилятором для .NET 3.5 / VS 2008. На самом деле язык не так уж плохо спроектирован для лямбда-выражений, просто реализация была неполной. NET 3.5. Поддержка лямбды включает в себя множество хитростей компиляции, которые не могут быть выполнены в сроки, требуемые для выпуска 2008 года. Я хочу отметить, что вы можете продолжать ориентироваться на вашу текущую версию .NET Framework, используя VS 2010, и получить полную поддержку лямбд, предоставляемую компилятором VS 2008. Это означает, что вы можете использовать многострочные лямбда-выражения и анонимную подпрограмму (для завершения предыдущей существующей анонимной функции), что позволяет Action <T> работать правильно. Вы также можете избежать использования символа подчеркивания для операторов кода muitiline. Это очень удобно при работе с лямбдами напрямую, свободно API или LINQ. Надеемся, что это может помочь вам убедительно аргументировать свой клиент для обновления версии компилятора без риска существенных изменений. Помимо очень существенного отсутствия поддержки блоков итераторов, реализация VB.NET в VS 2010 довольно приятна, как и сама Visual Studio на основе WPF! Джон Виггер

...