所以我创建此线程:Invoking Private/Protected Methods Via Reflection From The Same Object Instance (or Base)不能反映私人方法
而我们得到了问题修复保存私人方法。因为这可能不是同一个问题,所以我认为最好在完整源代码中发布不同的问题。这仍然是一项正在进行的工作,但它是功能性的。
的基类:
Public MustInherit Class BaseTransactionalSaveManager : Implements ITransactionalSaveManager
'---- Public Properties & Backing Fields ----'
Public Property FormDataIsValid As Boolean Implements ITransactionalSaveManager.FormDataIsValid
'---- Private Properties & Backing Fields ----'
Protected Property Stages As Collections.Generic.List(Of String)
Protected Property StageCausedRollback As Containers.GenericNamedValuePair(Of String, Boolean)
Protected Property CurrentStage As Integer
'---- Event Declarations & Associated Methods ----'
Public Event TransactionCancelled As EventHandler(Of CustomEventArgs.GenericSingleEventArgs(Of String)) Implements ITransactionalSaveManager.TransactionCancelled
Public Event TransactionCompleted As EventHandler(Of CustomEventArgs.GenericSingleEventArgs(Of String)) Implements ITransactionalSaveManager.TransactionCompleted
Public Event TransactionStagePassed As EventHandler(Of CustomEventArgs.GenericSingleEventArgs(Of String)) Implements ITransactionalSaveManager.TransactionStagePassed
Protected Overridable Sub OnTransactionCancelled(e As CustomEventArgs.GenericSingleEventArgs(Of String)) Implements ITransactionalSaveManager.OnTransactionCancelled
RaiseEvent TransactionCancelled(Me, e)
End Sub
Protected Overridable Sub OnTransactionCompleted(e As CustomEventArgs.GenericSingleEventArgs(Of String)) Implements ITransactionalSaveManager.OnTransactionCompleted
RaiseEvent TransactionCompleted(Me, e)
End Sub
Protected Overridable Sub OnTransactionStagePassed(e As CustomEventArgs.GenericSingleEventArgs(Of String)) Implements ITransactionalSaveManager.OnTransactionStagePassed
RaiseEvent TransactionStagePassed(Me, e)
End Sub
'---- Constructors ----'
Public Sub New()
Stages = New Collections.Generic.List(Of String)
SetStages()
CurrentStage = 0
StageCausedRollback = New Containers.GenericNamedValuePair(Of String, Boolean)
FormDataIsValid = True
End Sub
'---- Public Methods ----'
Public Sub ProcessStage() Implements ITransactionalSaveManager.ProcessStage
' Use stage to fire the correct method.
Me.GetType.InvokeMember(Stages(CurrentStage),
Reflection.BindingFlags.InvokeMethod Or
Reflection.BindingFlags.NonPublic Or
Reflection.BindingFlags.Public Or
Reflection.BindingFlags.Instance,
Type.DefaultBinder, Me, Nothing)
' Determine if the stage should cause a rollback.
If Not StageCausedRollback.Value Then
RollBackTransaction(StageCausedRollback.Name)
Exit Sub
End If
' Check if this stage is the last one.
If Stages(CurrentStage) = Stages.Last Then
OnTransactionCompleted(New CustomEventArgs.GenericSingleEventArgs(Of String)(Stages(CurrentStage)))
Else
OnTransactionStagePassed(New CustomEventArgs.GenericSingleEventArgs(Of String)(Stages(CurrentStage)))
End If
End Sub
Public Overridable Function TryCancelTransaction() As Boolean Implements ITransactionalSaveManager.TryCancelTransaction
OnTransactionCancelled(New CustomEventArgs.GenericSingleEventArgs(Of String)(""))
Return True
End Function
'--- Protected & Overridable Methods ----'
Protected Overridable Sub SetStages()
Me.Stages.Add(MethodNameToString(AddressOf Me.ConfirmFormDataIsValid))
End Sub
Protected Overridable Sub RollBackTransaction(stageThatCauseRollback As String)
OnTransactionCancelled(New CustomEventArgs.GenericSingleEventArgs(Of String)(stageThatCauseRollback))
End Sub
Protected Function MethodNameToString(addressOfMethod As Action) As String
Return addressOfMethod.Method.Name
End Function
Private Sub ConfirmFormDataIsValid()
StageCausedRollback.Name = MethodNameToString(AddressOf ConfirmFormDataIsValid)
StageCausedRollback.Value = If(FormDataIsValid, True, False)
End Sub
End Class
所以这个类是由一个(到目前为止)空的子类继承和ProcessStage被调用。注意ConfirmFormDataIsValid()子是私有的。如果你运行它,它不会找到这个方法。如果我将其更改为受保护,但它工作正常。
我错过了什么吗?
谢谢@vcsjones修复突出显示...我做错了什么? – deanvmc 2012-01-05 16:46:47
回复:“心理看语法高亮”。语法highlighter使用标签来决定代码的编写语言。由于您拥有C#标签,它选择了通过VB.NET突出显示的C#。您还可以明确地说出该代码与[HTML评论]的语言(http://meta.stackexchange.com/questions/78363/manually-specify-language-for-syntax-highlighting)。 – vcsjones 2012-01-05 16:46:47
您是否考虑过[Template Method Pattern](http://en.wikipedia.org/wiki/Template_method_pattern)而不是反射?我敢打赌它会更稳定。 (这个评论是基于这个_and_链接的问题。) – 2012-01-05 16:47:13