У меня есть следующий класс утилиты, созданный на С#.
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)
У кого-нибудь есть представление о том, что я пропускаю?
В VB Вы создаете функцию (а не Sub
). Это означает, что он будет иметь тип возврата. Тип возвращаемого значения выводится как Boolean
, а d.Prop2 = b.Prop2
интерпретируется как проверка равенства, а не операция присваивания. Это логическое возвращаемое значение затем отбрасывается, чтобы соответствовать сигнатуре AddMapping
, для чего требуется Action
.
apologies for the dutch namings
поэтому вы должны ВСЕГДА программировать на английском ИМХО; -) ...