当其他方法PerformAction()
返回true时,我的程序会使用BackgroundWorker来调用Method1
方法。我也在使用Strategy Pattern设置每次引发事件时应执行的正确PerformAction()
。
对于策略模式,我创建了一个抽象类,然后是一个继承它的抽象类中的类。
Public MustInherit Class Abstract
Public MustOverride Sub PerformAction(ByVal str as String)
Public Class Extends
Inherits Abstract
Public Overrides Sub PerformAction(ByVal str as String)
str = str.Substring(str.IndexOf(":"), str.IndexOf(">"))
MsgBox(str)
End Sub
End Class
我创建了另一个包含Abstract字段的类,用于调用PerformAction。
从BackgroundWorker.ReportProgress事件调用PerformAction方法,当BackgroundWorker.DoWork检测到Method1
返回true时调用该事件。使用上面的代码,它会导致带有附加信息的System.Reflection.TargetInvocationException
调用目标抛出了异常。
调试器告诉我:
this Cannot obtain value of local or argument '<this>' as it is not available at this instruction pointer, possibly because it has been optimized away. System.Delegate
args Cannot obtain value of local or argument 'args' as it is not available at this instruction pointer, possibly because it has been optimized away. object[]
奇怪的是,当我执行(在我看来)与两个子串相同的操作时:
s = s.Substring(s.IndexOf(":"))
s = s.Substring(0, s.IndexOf(">"))
它完美运作。
这两种方法有什么区别?我的继承是否设置错误,这是导致这些错误的原因?这是怎么回事?
如果我需要添加更多代码来解释这种情况,请告诉我。感谢。
答案 0 :(得分:1)
获得
的效果s = s.Substring(s.IndexOf(":"))
s = s.Substring(0, s.IndexOf(">"))
在单个语句中,您需要计算所需子字符串的长度
s = s.SubString(s.IndexOf(":"), s.IndexOf(">") - s.IndexOf(":"))
请注意,如果字符串可能不包含“:”后跟“&gt;”,则需要先验证IndexOf(":")
是&gt; = 0且{{1} }返回大于s.IndexOf(">")
的值。