Метод класса C # работает при вызове из C #, но не при вызове из VB.Net

1

У меня есть следующий класс утилиты, созданный на С#.

public class ObjectMapper<TSource, TTarget>
{
    private Collection<Action<TSource, TTarget>> _mappings =
                    new Collection<Action<TSource, TTarget>>();


    public void AddMapping(Action<TSource, TTarget> action)
    {
        _mappings.Add(action);
    }

    public void ApplyMappings(TSource source, TTarget target)
    {
        foreach (var mapping in _mappings)
        {
            mapping(source, target);
        }
    }
}

Я могу использовать этот класс для копирования свойств с одного объекта на другой. Я знаю, что есть другие альтернативы, такие как AutoMapper, но это не входит в сферу моего вопроса.

Когда я использую этот класс из проекта С#, все работает нормально. Модульные тесты проходят и т.д. Ниже приведен пример использования этого класса с С# (извинения за голландские названия).

        // Arrange
        // initialiseer auteur
        Auteur auteur = new Auteur
        {
            Achternaam = "Loon",
            Tussenvoegsel = "van",
            Initialen = "P."
        };

        // initialiseer boek
        Boek boek = new Boek
        {
            Auteur = auteur,
            Titel = "Ravelijn",
            Isbn13 = "9789025857813",
            Druk = 1,
            UitgaveJaar = 2011,
            Uitgever = "Leopold B.V."
        };

        // initialiseer mapper
        ObjectMapper<Boek, BibliotheekItem> mapper = new ObjectMapper<Boek, BibliotheekItem>();
        mapper.AddMapping((bk, bib) => bib.Auteur = boek.Auteur.Initialen +
                                                    (string.IsNullOrEmpty(boek.Auteur.Tussenvoegsel) ? " " : " " + boek.Auteur.Tussenvoegsel + " ") +
                                                    boek.Auteur.Achternaam);
        mapper.AddMapping((bk, bib) => bib.Titel = boek.Titel);
        mapper.AddMapping((bk, bib) => bib.Uitgave = boek.Uitgever + ", " + boek.UitgaveJaar.ToString());
        mapper.AddMapping((bk, bib) => bib.Type = BibliotheekItem.ItemType.BOEK);
        mapper.AddMapping((bk, bib) => bib.Id = "ISBN13:" + bk.Isbn13);

        // Act
        BibliotheekItem bi = new BibliotheekItem();
        mapper.ApplyMappings(boek, bi);

        // Assert
        Assert.AreEqual("P. van Loon", bi.Auteur, false);
        Assert.AreEqual("Leopold B.V., 2011", bi.Uitgave, false);

Когда я пытаюсь использовать этот класс из проекта VB.Net, свойства моего целевого объекта остаются пустыми. Я действительно не смог найти причину этого.

Dim bron As New Bron
    Dim doel As New Doel

    bron.Prop1 = "Waarde 1"
    bron.Prop2 = "Waarde 2"

    Dim mapper As ObjectMapper(Of Bron, Doel) = New bogaarts.algemeen.ObjectMapper(Of Bron, Doel)
    mapper.AddMapping(Function(b, d) d.Prop1 = b.Prop1)
    mapper.AddMapping(Function(b, d) d.Prop2 = b.Prop2)
    mapper.PasMappingsToe(bron, doel)

    MessageBox.Show(doel.Prop1 & " : " & doel.Prop2)

У кого-нибудь есть представление о том, что я пропускаю?

  • 4
    Код C # добавляет различные сопоставления в код VB.Net, которые могут иметь значение.
  • 1
    apologies for the dutch namings поэтому вы должны ВСЕГДА программировать на английском ИМХО; -) ...
Показать ещё 3 комментария
Теги:

1 ответ

4
Лучший ответ

В VB Вы создаете функцию (а не Sub). Это означает, что он будет иметь тип возврата. Тип возвращаемого значения выводится как Boolean, а d.Prop2 = b.Prop2 интерпретируется как проверка равенства, а не операция присваивания. Это логическое возвращаемое значение затем отбрасывается, чтобы соответствовать сигнатуре AddMapping, для чего требуется Action.

  • 0
    и это одна из веских причин, по которой присваивание и равенство не должны быть перегружены.
  • 0
    Спасибо за вашу реакцию. Я уже пытался использовать действие вместо функции, но еще не смог выяснить, каков правильный синтаксис. Можете ли вы дать мне пример?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню