Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net Can';不要反思私人方法_Vb.net_Reflection - Fatal编程技术网

Vb.net Can';不要反思私人方法

Vb.net Can';不要反思私人方法,vb.net,reflection,Vb.net,Reflection,所以我创建了这个线程: 我们解决了这个问题,只保留了私有方法。由于这可能不是同一个问题,我认为最好用完整的来源发布一个不同的问题。这仍然是一项正在进行的工作,但它是功能性的 基类: Public MustInherit类BaseTransactionalSaveManager:实现ITransactionalSaveManager '----公共属性和支持字段--' 公共属性FormDataIsValid作为布尔值实现ITransactionalSaveManager.FormDataIsVal

所以我创建了这个线程:

我们解决了这个问题,只保留了私有方法。由于这可能不是同一个问题,我认为最好用完整的来源发布一个不同的问题。这仍然是一项正在进行的工作,但它是功能性的

基类:

Public MustInherit类BaseTransactionalSaveManager:实现ITransactionalSaveManager
'----公共属性和支持字段--'
公共属性FormDataIsValid作为布尔值实现ITransactionalSaveManager.FormDataIsValid
'----私有属性和支持字段--'
受保护的属性阶段作为集合.Generic.List(字符串)
受保护的属性StageCasedRollback作为容器。GenericNamedValuePair(字符串,布尔值)
受保护的属性CurrentStage为整数
'----事件声明和关联方法--'
公共事件事务已取消,因为EventHandler(属于CustomEventArgs.GenericSingleEventArgs(属于字符串))实现了ITransactionalSaveManager.TransactionCancelled
公共事件事务处理已完成,因为EventHandler(属于CustomEventArgs.GenericSingleEventArgs(属于字符串))实现了ITransactionalSaveManager.TransactionCompleted
公共事件TransactionStagePassedAsEventHandler(属于CustomEventArgs.GenericSingleEventArgs(属于字符串))实现ITransactionalSaveManager.TransactionStagePassed
受保护的可重写子OnTransactionCancelled(如CustomEventArgs.GenericSingleEventArgs(字符串))实现ITransactionalSaveManager.OnTransactionCancelled
RaiseEvent交易取消(Me,e)
端接头
受保护的可重写子OnTransactionCompleted(如CustomEventArgs.GenericSingleEventArgs(字符串))实现ITransactionalSaveManager.OnTransactionCompleted
RaiseEvent事务已完成(Me,e)
端接头
受保护的可重写子OnTransactionStagePassed(如CustomEventArgs.GenericSingleEventArgs(字符串))实现ITransactionalSaveManager.OnTransactionStagePassed
RaiseEvent TransactionStagePassed(Me,e)
端接头
“----构造函数--”
公共分新()
Stages=新集合.Generic.List(字符串)
设置阶段()
CurrentStage=0
StageCasedRollback=新容器。GenericNamedValuePair(字符串,布尔值)
FormDataIsValid=True
端接头
“----公共方法--”
Public Sub ProcessStage()实现ITransactionalSaveManager.ProcessStage
'使用stage来启动正确的方法。
Me.GetType.InvokeMember(Stages(CurrentStage)),
Reflection.BindingFlags.InvokeMethod或
Reflection.BindingFlags.NonPublic或
Reflection.BindingFlags.Public或
Reflection.BindingFlags.Instance,
Type.DefaultBinder、Me、Nothing)
'确定该阶段是否应导致回滚。
如果不是StageCasedRollback.Value,则
回滚事务(stageCasedRollback.Name)
出口接头
如果结束
'检查此阶段是否是最后一个阶段。
如果阶段(CurrentStage)=阶段。最后
OnTransactionCompleted(新的CustomEventArgs.GenericSingleEventArgs(共字符串)(阶段(CurrentStage)))
其他的
OnTransactionStagePassed(新的CustomEventArgs.GenericSingleEventArgs(字符串的)(阶段(CurrentStage)))
如果结束
端接头
作为布尔值的公共可重写函数TryCancelTransaction()实现ITransactionalSaveManager.TryCancelTransaction
OnTransactionCancelled(新的CustomEventArgs.GenericSingleEventArgs(共字符串)(“”))
返回真值
端函数
“--受保护和可重写的方法--”
受保护的可覆盖子集位()
Me.Stages.Add(MethodNameToString(AddressOf Me.ConfirmFormDataIsValid))
端接头
受保护的可重写子回滚事务(stageThatCauseRollback为字符串)
OnTransactionCancelled(新的CustomEventArgs.GenericSingleEventArgs(字符串的)(stageThatCauseRollback))
端接头
受保护的函数MethodNameToString(addressOfMethod As Action)作为字符串
返回地址Method.Method.Name
端函数
私有子ConfirmFormDataIsValid()
StageCasedRollback.Name=MethodNameToString(ConfirmFormDataIsValid的地址)
stageCasedRollback.Value=If(FormDataIsValid、True、False)
端接头
末级
所以这个类被一个(到目前为止)空的子类继承,并调用ProcessStage。请注意,ConfirmFormDataIsValid()子项是私有的。如果运行此命令,将找不到此方法。如果我把它改为protected,它就可以正常工作了


我遗漏了什么吗?

您需要调用
Me.GetType.InvokeMember
(ProcessStage的第一行),而不是
Me.GetType.BaseType.invokeMber

即使使用
BindingFlags.NonPublic
,您也不会在子类中看到私有成员

显然,这个解决方案有点脆弱,因为它取决于您拥有多少级别的子类,以及您是否能在BaseType中看到该方法。您可能需要循环类链,直到找到
BaseTransactionalSaveManager
的基类型,然后找到该方法


希望有帮助。

您需要调用
Me.GetType.InvokeMember,而不是
Me.GetType.invokeMber
(ProcessStage的第一行)

即使使用
BindingFlags.NonPublic
,您也不会在子类中看到私有成员

显然,这个解决方案有点脆弱,因为它取决于您拥有多少级别的子类,以及您是否能在BaseType中看到该方法。您可能需要循环类链,直到找到
BaseTransactionalSaveManager
的基类型,然后找到该方法


希望这会有所帮助。

这并不能回答你的问题,但希望能给你一些帮助