VB.net继承,只在一个调用上找不到成员

时间:2014-01-30 16:53:20

标签: vb.net inheritance

我对这个感到茫然。我有一个继承自“BaseClass”的类。 BaseClass有一个名为“UpdateData”的受保护成员。

我有一个继承自“UpdateData”的类“DataAccess”。 DataAccess有许多使用“UpdateData”方法的不同调用。除了“DataAccess”上的一个返回“未找到成员”异常的单个方法之外,这个工作正常。

我已经清理并重建了,它发生在Visual Studio以及部署到服务器时。对“添加”的调用有效,但对“添加详细信息”的调用失败。

我已经尝试删除下面列出的事务范围,尝试使用工厂模式为每个调用获取一个新实例,但两者都没有工作。我宁愿不把这个方法打开为“public”,因为我们有数百个使用受保护的“UpdateData”方法的类就好了吗?

非常感谢任何帮助或新想法!

''''On the base class
Protected Sub UpdateData(ByVal connString As String, ByVal procName As String, ByVal    ParamArray params As Object())
   UpdateDataWithTimeout(connString, procName, getTimeoutSetting, params)
End Sub

''''On the inherited class.  This one works
Protected Friend Overridable Sub Add(ByVal s1 As String, _
                        ByRef s2 As String, _
                        ByVal s3 As String, _
                        ByVal params As List(Of Object))

        Try

            params.Insert(0, s1)
            params.Insert(1, s2)
            params.Insert(2, s3)

            UpdateData(DB, SPI_PROC1, params.ToArray())

        Catch ex As Exception
            Throw ex
        End Try
    End Sub

''''On the inherited "DataAccess" class.  This one fails.
Protected Friend Overridable Sub AddDetail(ByVal ParamArray parms As Object())
    If Condition1 Then
            UpdateData(_sysConn, SPI_PROC, parms)
    End If
    End Sub

''''This is from a method in the class calling the "DataAccess" code
Dim da As DataAccess

da = New DataAccess(strVariable)

Using scope As New TransactionScope(TransactionScopeOption.RequiresNew)

    ''''This call works just fine and can find "UpdateData"
    da.Add(string1, string2, string3, objectParameterList)

    'Separate database, so avoid MSDTC with new transaction scope
    Using scope2 As New TransactionScope(TransactionScopeOption.RequiresNew)
        ''''This call fails to find UpdateData
        da.AddDetail(string1, string5, string6, string7, string8, string3)

        scope2.Complete()
        scope.Complete()
    End Using

End Using

附录:IL在这里有一个区别,一个是“后期绑定”(我需要停止),但我不确定如何?

失败的方法......

  IL_001f:  ldstr      "UpdateData"
  IL_0024:  ldc.i4.3
  IL_0025:  newarr     [mscorlib]System.Object
  IL_002a:  stloc.1
  IL_002b:  ldloc.1
  IL_002c:  ldc.i4.0
  IL_002d:  ldarg.0
  IL_002e:  ldfld      string DataAccess::_sysConn
  IL_0033:  stelem.ref
  IL_0034:  ldloc.1
  IL_0035:  ldc.i4.1
  IL_0036:  ldloc.0
  IL_0037:  call       object [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(object)
  IL_003c:  stelem.ref
  IL_003d:  ldloc.1
  IL_003e:  ldc.i4.2
  IL_003f:  ldarg.1
  IL_0040:  stelem.ref
  IL_0041:  ldloc.1
  IL_0042:  stloc.2
  IL_0043:  ldloc.2
  IL_0044:  ldnull
  IL_0045:  ldnull
  IL_0046:  ldc.i4.3
  IL_0047:  newarr     [mscorlib]System.Boolean
  IL_004c:  stloc.3
  IL_004d:  ldloc.3
  IL_004e:  ldc.i4.0
  IL_004f:  ldc.i4.1
  IL_0050:  stelem.i1
  IL_0051:  ldloc.3
  IL_0052:  ldc.i4.1
  IL_0053:  ldc.i4.1
  IL_0054:  stelem.i1
  IL_0055:  ldloc.3
  IL_0056:  ldc.i4.2
  IL_0057:  ldc.i4.1
  IL_0058:  stelem.i1
  IL_0059:  ldloc.3
  IL_005a:  ldc.i4.1
  IL_005b:  call       object [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.NewLateBinding::LateCall(object,
                                                                                                                     class [mscorlib]System.Type,
                                                                                                                     string,
                                                                                                                     object[],
                                                                                                                     string[],
                                                                                                                     class [mscorlib]System.Type[],
                                                                                                                     bool[],
                                                                                                                     bool)
  IL_0060:  pop
  IL_0061:  ldloc.3
  IL_0062:  ldc.i4.0
  IL_0063:  ldelem.i1
  IL_0064:  brfalse.s  IL_0088
  IL_0066:  ldarg.0
  IL_0067:  ldloc.2
  IL_0068:  ldc.i4.0
  IL_0069:  ldelem.ref
  IL_006a:  call       object [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(object)

从工作方法来看,这是IL。

  IL_003b:  ldarg.0
  IL_003c:  ldstr      "conn"
  IL_0041:  ldstr      "proc"
  IL_0046:  ldarg.0
  IL_0047:  callvirt   instance string DataAccess::get_SYSCODE_SPAPPEND()
  IL_004c:  call       string [mscorlib]System.String::Concat(string,
                                                              string)
  IL_0051:  ldarg.s    params
  IL_0053:  callvirt   instance !0[] class [mscorlib]System.Collections.Generic.List`1<object>::ToArray()
  IL_0058:  callvirt   instance void [BaseClass]BaseClass::UpdateData(string,
                                                                                                                           string,
                                                                                                                           object[])

1 个答案:

答案 0 :(得分:0)

当然,在您提出问题答案的那一刻。

我将SPI_PROC和SPI_PROC1的字符串变量更改为类的私有常量而不是变量...在类构造函数中设置_sysConn和DB,并将所有内容切换为早期绑定。

问题解决了。希望这可以节省其他人几个小时的时间。