2011-10-06 120 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。感谢您的发现。 –