【发布时间】:2014-07-31 13:16:57
【问题描述】:
我们目前在 C# 应用程序中使用许多扩展方法来使用 LINQ 将通用数据集转换为强类型对象。主要目的是,如果有一些转换类型问题或其他异常,扩展方法可以记录错误。
我们正在尝试将此代码转换为 VB.NET 应用程序,但用于向 DataRow 对象公开扩展方法的模块不起作用。它不编译。 sn -p 2 中的以下行有编译错误,它没有看到 GetFieldAsString。
.MajorPurchaseXID = row.GetFieldAsString("") _
这里是 C# 中的代码,首先 sn-p 是位于我们的 linq 类中的扩展方法。第二个sn-p就是在我们的数据访问层方法中这个扩展方法的使用。
public static class Linq
{
public static string GetFieldAsString(this DataRow row, string field)
{
return row.Field<string>(field);
}
}
第二个片段>>
List<OfferGroupInfo> offerGroupList = new List<OfferGroupInfo>();
offerGroupList = (from row in ds.Tables[0].AsEnumerable()
select new OfferGroupInfo
{
XID = row.GetFieldAsInt("OfferGroupXID"),
OfferGroupTypeXID = row.GetFieldAsInt("OfferGroupTypeXID"),
OfferGroupType = row.GetFieldAsString("OfferGroupType"),
Name = row.GetFieldAsString("OfferGroup"),
Description = row.GetFieldAsString("OfferGroupDesc")
}).ToList();
现在,这是我们对 vb.net 的转换。第一个 sn-p 是方法标记为扩展的模块。第二个 sn-p 是用法,同样在我们的数据访问中。
我们已经尝试了几件事,但无法让 GetFieldAsString 方法像在 C# 中那样作为 DataRow 对象的扩展工作。我们需要让它工作,因为我们想调用 row.>ExtensionMethodName> 而不是(数据行、字段等...)作为参数。想法?
Namespace ToolBox
Module LinqExtensionMethods
<Extension()>
Public Function GetFieldAsString(row As DataRow, field as String) As String
Try
Return row.Field(Of String)(field)
Catch ex As Exception
LogHandler.WriteError("some error message here")
Throw New HandledException
End Try
End Function
End Module
End Namespace
第二个片段>>
Dim mppTicketTermList As New List(Of MPPTicketTerms)
mppTicketTermList = (From row In ds.Tables(0).AsEnumerable() _
Select New MPPTicketTerms With _
{ _
.MajorPurchaseXID = row.GetFieldAsString("") _
}).ToList()
【问题讨论】:
-
请告诉我们问题出在哪里。只是说它不起作用根本没有帮助。您的 catch 块似乎丢弃了有关可能已抛出的任何异常的所有信息。你有什么例外吗?
-
我们无法让 GetFieldAsString 方法作为 DataRow 的扩展工作。行中的 GetFieldAsString 函数调用: .MajorPurchaseXID = row.GetFieldAsString("") 无法编译,因为它看不到它。向 DataRow 对象公开扩展方法的 Module 类似乎不起作用。它不会出现在智能感知中,也不会编译。
-
您的代码似乎是合法的,您可能缺少 ToolBox 或 ComplierServices 的导入子句
-
那么编译错误是什么?
-
sdf - 不,我们有 ToolBox 的导入子句,调用方法类不需要导入到 compilerservices,只是在创建模块的地方。
标签: c# asp.net .net vb.net linq