将VB.NET应用从2.0升级到4.6后遇Parameters重载解析失败问题求助
Parameters成员解析失败的解决思路 哥们,我帮你捋捋这个升级后碰到的System.MissingMemberException问题——框架版本从2.0跳到4.6,确实会有不少隐式的规则变化,咱们从代码里的关键点分析:
核心错误原因
你代码里的oCmdCommandCol是ArrayList类型,取出的对象是Object,在.NET 2.0时代如果项目是Option Strict Off,编译器允许后期绑定(也就是直接用Object访问成员),但到了4.6版本,要么默认Option Strict On了,要么框架对后期绑定的校验更严格,导致编译器/运行时找不到匹配的Parameters重载。
下面是几个具体的解决方向:
用泛型集合替代ArrayList,解决类型安全问题
ArrayList是弱类型容器,升级到.NET 4.6后建议换成List(Of SqlCommand)(如果是SQL Server的命令,其他数据库对应OleDbCommand等)。这样取出的对象是强类型的,编译器能直接识别Parameters集合的索引器,不会出现重载匹配失败的问题。修改集合定义示例:
' 原来的ArrayList定义 ' Dim oCmdCollection As New ArrayList() ' 改成泛型List Dim oCmdCollection As New List(Of SqlCommand)()显式转换对象类型,避免后期绑定
如果暂时不想改集合类型,那在访问Parameters之前,把ArrayList里的Object转换成具体的命令类型,让运行时能明确找到对应的成员:' 在你的MyFunction123里,先转换对象类型 Dim targetCmd As SqlCommand = DirectCast(oCmdCommandCol(iCmdCount), SqlCommand) ' 再访问Parameters,同时显式转换参数名的类型为String Dim paramName As String = CStr(oCNode.ChildNodes(iCount).Attributes("SPParameter").Value) iRetVal = CInt(targetCmd.Parameters(paramName).Value)检查
Option Strict设置
右键项目→属性→编译,看看Option Strict是不是被设为On了。如果是,那必须保证类型转换是显式的,不能依赖隐式的后期绑定——这其实是好事,能提前避免很多类型错误。如果确实需要临时兼容旧代码,可以改成Off,但更推荐用前面的强类型方案。
修改后的完整函数示例
Private Function MyFunction123(ByRef oXMLConfigData As XmlNodeList, ByRef oCmdCommandCol As List(Of SqlCommand), ByVal iCmdCount As Integer, ByRef oReturnDataset As ReturnValues) As Boolean Dim iCount As Integer Dim iRetVal As Integer Dim oCNode As XmlNode Dim retVal As Boolean = False ' 强类型访问命令对象 Dim targetCmd As SqlCommand = oCmdCommandCol(iCmdCount) Dim paramName As String = CStr(oCNode.ChildNodes(iCount).Attributes("SPParameter").Value) ' 确保Value的类型转换(如果参数值是Integer的话) iRetVal = CInt(targetCmd.Parameters(paramName).Value) oCNode.ChildNodes(iCount).InnerText = iRetVal oReturnDataset.ReturnValues.AddReturnValuesRow(oCNode.Attributes("Name").Value, oCNode.ChildNodes(iCount).Attributes("Name").Value, oCNode.ChildNodes(iCount).InnerText) retVal = True Return retVal End Function
内容的提问来源于stack exchange,提问作者captainsac

