2011-10-06 122 views
2

我有一個將IDataReader映射到類的函數。它顯然是用C#編寫的。我的同事想要在他的代碼中使用相同的方法,但他正在使用VB.net編寫。基本上,由於C#中使用的Lambda表達式,我很難重寫這個。他正在運行.Net 3.5。將C#lambda函數轉換爲VB.net

任何人都可以幫助我嗎?

private Func<IDataReader, ScanItem> resultMapper = r => 
    { 
     var si = new ScanItem() 
     { 
      StoreGroupCode = r.ToInt32("GRP_CDE"), 
      StoreCode = r.ToInt32("STOR_CDE"), 
      EventNumber = r.ToInt32("EVENT_NUM"), 
      AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"), 
      LabelNumber = r.ToInt32("LBL_NUM"), 
      ScanType = r.ToString("INV_SCAN_TYP_IND"), 
      SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"), 
      UPC = r.ToLong("VEN_UPC_NUM"), 
      ActualQuantity = r.ToLong("ACT_CNT_QTY") 
     }; 

     return si; 
    }; 
+0

一定要標記可以幫助您接受的答案,並且您應該對您的其他問題也做同樣的事(即使您提供了最佳答案)。 – jmoreno

回答

3

IIRC .NET 3.5中的VB.NET不支持匿名函數。使用VB.NET的同事必須定義一個包含此代碼的函數,並在lambda表達式中使用此函數。現在,這是說,這是不是真的有必要在這種情況下,使用複雜的功能與身體和這個代碼可以簡化爲:

private Func<IDataReader, ScanItem> resultMapper = r => new ScanItem 
{ 
    StoreGroupCode = r.ToInt32("GRP_CDE"), 
    StoreCode = r.ToInt32("STOR_CDE"), 
    EventNumber = r.ToInt32("EVENT_NUM"), 
    AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"), 
    LabelNumber = r.ToInt32("LBL_NUM"), 
    ScanType = r.ToString("INV_SCAN_TYP_IND"), 
    SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"), 
    UPC = r.ToLong("VEN_UPC_NUM"), 
    ActualQuantity = r.ToLong("ACT_CNT_QTY") 
}; 

通常如果我的VB.NET是不是太生疏看起來應該沿着線:

Private resultMapper As Func(Of IDataReader, ScanItem) = Function(r) New ScanItem() With { _ 
    .StoreGroupCode = r.ToInt32("GRP_CDE"), _ 
    .StoreCode = r.ToInt32("STOR_CDE"), _ 
    .EventNumber = r.ToInt32("EVENT_NUM"), _ 
    .AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"), _ 
    .LabelNumber = r.ToInt32("LBL_NUM"), _ 
    .ScanType = r.ToString("INV_SCAN_TYP_IND"), _ 
    .SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"), _ 
    .UPC = r.ToLong("VEN_UPC_NUM"), _ 
    .ActualQuantity = r.ToLong("ACT_CNT_QTY") _ 
} 
+0

海報並不是真的需要匿名方法的身體。它可以很容易地簡化成一個單行.... – Jeff

+0

@ JeffN825,是的,當然可以。 –

0

我只是嘗試這樣做,它有沒有問題轉換代碼:

http://www.developerfusion.com/tools/convert/csharp-to-vb/

唯一的日需要注意的是VB.NET 9(VS 2008/.NET 3.5)不支持多行lambda表達式。所以你不能把它分成兩行。

所以......

Private resultMapper As Func(Of IDataReader, ScanItem) = Function(r) New ScanItem() With { _ 
    .StoreGroupCode = r.ToInt32("GRP_CDE"), _ 
    .StoreCode = r.ToInt32("STOR_CDE"), _ 
    .EventNumber = r.ToInt32("EVENT_NUM"), _ 
    .AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"), _ 
    .LabelNumber = r.ToInt32("LBL_NUM"), _ 
    .ScanType = r.ToString("INV_SCAN_TYP_IND"), _ 
    .SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"), _ 
    .UPC = r.ToLong("VEN_UPC_NUM"), _ 
    .ActualQuantity = r.ToLong("ACT_CNT_QTY") _ 
} 
+1

自動轉換器有點困惑。 'Key'關鍵字不屬於這裏,因爲這不是一個匿名類。 –

+0

好點。糾正。 – Jeff

1

簡單:

Private resultMapper As Func(Of IDataReader, ScanItem) = Function (r) _ 
    New ScanItem() With { _ 
     .StoreGroupCode = r.ToInt32("GRP_CDE"), _ 
     .StoreCode = r.ToInt32("STOR_CDE"), _ 
     .EventNumber = r.ToInt32("EVENT_NUM"), _ 
     .AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"), _ 
     .LabelNumber = r.ToInt32("LBL_NUM"), _ 
     .ScanType = r.ToString("INV_SCAN_TYP_IND"), _ 
     .SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"), _ 
     .UPC = r.ToLong("VEN_UPC_NUM"), _ 
     .ActualQuantity = r.ToLong("ACT_CNT_QTY") _ 
    } 

在VB中的新版本,你可以省略惱人明確的行延續(_)。

+1

'Func '應該可能是'Func(Of IDataReader,ScanItem)'。 –

+0

這是如何編譯的?您在聲明中有兩次resultMapper! –

+0

@Chris Typo。感謝您的發現。 –