Конвертировать лямбда-функцию C # в VB.net - PullRequest
2 голосов
/ 07 октября 2011

У меня есть эта функция, которая отображает IDataReader в класс. Это явно написано на C #. Мой коллега хочет использовать тот же метод в своем коде, но он пишет на VB.net. По сути, мне трудно переписать это из-за лямбда-выражений, используемых в C #. Он работает .Net 3.5.

Кто-нибудь может мне помочь?

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;
    };

Ответы [ 3 ]

3 голосов
/ 07 октября 2011

IIRC VB.NET в .NET 3.5 не поддерживает анонимные функции с телом. Ваш коллега, использующий VB.NET, должен будет определить функцию, содержащую этот код, и в лямбда-выражении использовать эту функцию. Теперь, как говорится, на самом деле нет необходимости использовать сложную функцию с телом в этом случае, и этот код можно упростить до:

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") _
}
1 голос
/ 07 октября 2011

Легко:

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 вы можете пропустить раздражающие явные продолжения строки (_).

0 голосов
/ 07 октября 2011

Я только что попробовал это, и у него не было проблем с преобразованием кода:

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

Единственное, о чем нужно знать, это VB.NET 9 (VS 2008 / .NET 3.5).не поддерживает многострочные лямбда-выражения.Таким образом, вы не можете разбить его на 2 строки.

Итак ...

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") _
}
...