2014-12-02 106 views
1

我有以下工具类,在C#中创建。当从C#调用C#类的方法时,但不从VB.Net调用时工作

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,但这不属于我的问题范围。

当我从C#项目中使用这个类时,一切正常。单元测试通过等。下面是C#中这个类的使用示例(荷兰语的道歉)。

 // 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代码添加不同的映射,这可能是相关的。 – Jodrell 2014-12-02 15:24:08

+1

'抱歉的荷兰namings'这就是为什么你应该总是用英语恕我直言; - )... – ChrFin 2014-12-02 15:26:35

+1

看看[元](http://meta.stackoverflow.com/questions/266563/do-non-英语单词增加接受概率的提示/)来粗略猜测非英语命名如何影响常见StackOverflow用户的行为。 – nvoigt 2014-12-02 15:27:17

回答

4

在VB中您正在创建一个函数(而不是Sub)。这意味着它将有一个返回类型。返回类型被推断为Boolean,并且d.Prop2 = b.Prop2被解释为相等性检查而不是分配操作。然后该布尔返回值被丢弃以符合AddMapping的签名,该签名需要Action

+0

,这是为什么不应该重载分配和等式的一个很好的理由。 – Jodrell 2014-12-02 15:32:28

+0

感谢您的反馈。我已经尝试使用Action而不是Function,但尚未能够找出正确的语法。你能给我一个例子吗? – 2014-12-02 15:42:02

+1

@BjörnBoxstart我已经告诉过你,你需要使用'Sub'而不是'Function'。 – Servy 2014-12-02 15:43:11

相关问题