我有这个函数将IDataReader映射到一个类。它显然是用C#编写的。我的同事想在他的代码中使用相同的方法,但他正在VB.net中编写。基本上我由于C#中使用的Lambda表达式而难以重写它。他正在运行.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;
};
答案 0 :(得分:3)
IIRC VB.NET .NET 3.5不支持使用body的匿名函数。使用VB.NET的同事必须定义一个包含此代码的函数,并在lambda表达式中使用此函数。现在,这就是说,在这种情况下,没有必要使用带有body的复杂函数,这段代码可以简化为:
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 :(得分: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中,您可以省略恼人的显式续行(_
)。
答案 2 :(得分: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") _
}