【发布时间】:2015-04-14 13:44:31
【问题描述】:
我想为一个对象的所有方法添加一个通用的回调函数。我找到了this SO question,但在这种方法中,我必须修改类的每个函数。我想定义一些beforeFilter 方法,在每次方法调用之前触发。我知道我可以为此使用Action delegates,但我不知道该怎么做。
更新:例如,我想要的是这样的
Class MyClass
Sub MyCallback
'callback code...
End Sub
'Rest of tyhe code
End Class
如您所见,理想的做法是在所有其他方法之前添加一个简单(或多个)方法来触发。也许有一些基类或接口,我不知道(这就是我要求的原因)。
我认为可能的其他一些选择是克隆对象并定义一个新类,而不是向现有类添加代码。所以在那Class使用Object通过Type访问方法
Class NewClass
Sub AddCallback(Obj As Object, Callback As Action)
'Add the callback here
End Sub
End Class
我只是在猜测,也许我的某些选择甚至不可行,所以请帮助我解决这个问题
最接近的方法
我现在有的,就是这个方法
Sub RunWithCallback(beforFilter As Action, f As Action)
beforeFilter()
f()
End Sub
(这意味着RunWithCallback 有很多重载来管理带有Actions 和Funcs 委托的Sub 和函数,具有不同数量的参数)要使用它,我将不得不运行这个Sub调用任何 Object 方法(传递 ByRef 参数以捕获函数中的返回值)。像这样的
Public Sub DoNothing()
Debug.WriteLine("Callback working!")
End Sub
Public Sub BeforeFilter()
Debug.WriteLine("Testing callback...")
End Sub
'To run the above function
RunWithCallback(AddressOf BeforeFilter, AddressOf DoNothing)
我认为应该有一个更好的解决方案,可以避免调用相同的子,避免重载,对象类的某种动态扩展方法
【问题讨论】:
-
一些示例代码可能有用。事实上,目前还不清楚你想要什么。例如,
beforeFilter应该在调用方法之前还是在每个方法开始时调用?Action委托仍然需要重构,所以这似乎不是您想要的。 -
检查我的编辑,如果您仍有疑问,请再次评论。
-
如果
MyCallback在MyClass中并从MyClass调用,为什么类不能调用它(这与“回调”完全不同)。当方法不可以访问您希望从其他地方使用的方法时,更常见的是使用委托(不一定是Action)。例如,ClassA.DoFoo是从 ClassB 调用的,而在DoFoo的过程中,您需要它来调用ClassB.GetBar。 -
我可以访问我想要检查的类,但是那个类有大约 1k 行代码,而且我还有一些其他类似的类,所以在每个方法之前添加一个方法的调用类的不是一个好的选择
-
对不起,您的问题仍然很混乱。在调用任何/所有其他本地方法之前运行的 beforeFilter 方法示例根本没有真正描述回调。你应该明确what你想做什么,而不是如何,否则你将得到的唯一答案将基于标题并与委托相关。
标签: c# vb.net callback delegates