2014-12-02 58 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