C# 如何向webform项目添加回调

C# 如何向webform项目添加回调,c#,vb.net,callback,delegates,C#,Vb.net,Callback,Delegates,我想向对象的所有方法添加一个公共回调函数。我发现,但在这个过程中,我必须修改类的每个函数。我想定义一些在每次方法调用之前触发的beforeFilter方法。我知道我可以这样做,但我不知道怎么做 更新:举个例子,我想要的是这样的东西 Class-MyClass 子MyCallback '回拨代码。。。 端接头 “剩下的代码 末级 如您所见,理想情况是在所有其他方法之前添加一个简单(或多个)方法来触发。可能有一些基类或接口,我不知道(这就是为什么我要求) 我认为可能的另一种选择是克隆对象并定义一个

我想向对象的所有方法添加一个公共回调函数。我发现,但在这个过程中,我必须修改类的每个函数。我想定义一些在每次方法调用之前触发的
beforeFilter
方法。我知道我可以这样做,但我不知道怎么做

更新:举个例子,我想要的是这样的东西

Class-MyClass
子MyCallback
'回拨代码。。。
端接头
“剩下的代码
末级
如您所见,理想情况是在所有其他方法之前添加一个简单(或多个)方法来触发。可能有一些基类或接口,我不知道(这就是为什么我要求)

我认为可能的另一种选择是克隆对象并定义一个新类,而不是向现有类添加代码。因此,在
类中
使用
对象
访问方法,而
类型

Class新类
子AddCallback(对象为Obj,动作为Callback)
'在此处添加回调
端接头
末级
我只是猜测,也许我的一些选择甚至是不可行的,所以请帮助我在这方面

最近接近

我现在拥有的是这种方法

Sub RunWithCallback(beforFilter As Action,f As Action)
beforeFilter()
f()
端接头
(这意味着
RunWithCallback
要管理具有
Action
s和
Func
s委托的Sub和函数,以及不同数量的参数,需要大量重载)要使用此功能,我必须运行此Sub,而不是调用任何对象方法(传递
ByRef
参数以捕获函数中的返回值)

Public Sub DoNothing()
WriteLine(“回调正在工作!”)
端接头
公共子预过滤器()
Debug.WriteLine(“测试回调…”)
端接头
'来运行上述函数
RunWithCallback(PreforeFilter的地址,DoNothing的地址)

我认为应该有更好的解决方案,可以避免调用同一个子类,避免重载,对象类的某种动态扩展方法这里是一个代理如何工作以及如何使用它们的示例:

public class MyClass
{
    // MyDelegate callback holder
    private MyDelegate _myDelegate;

    // Singleton holder
    private static volatile MyClass _instance;

    ///<summary>
    /// Instance property
    ///</summary>
    public static MyClass Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new MyClass();
            }
            _instance.MyCallbacks(_instance.MyDelegateCallback, _instance.MyDelegateCallback1);
            return _instance;
        }
    }

    ///<summary>
    /// Instance multi-callback caller
    ///</summary>
    ///<param name="callbacks">calbacks to call</param>
    ///<returns>MyClass</returns>
    public static MyClass Instance(params MyDelegate[] callbacks)
    {
        if (_instance == null)
        {
            _instance = new MyClass();
        }
        _instance.MyCallbacks(callbacks);
        return _instance;
    }

    ///<summary>
    /// MyClass constructor
    ///</summary>
    private MyClass()
    {
        // Define the callback
        MyDelegate = MyDelegateCallback;
    }

    ///<summary>
    /// MyDelegate property, here u can change the callback to any function which matches the structure of MyDelegate 
    ///</summary>
    public MyDelegate MyDelegate
    {
        get
        {
            return _myDelegate;
        }
        set
        {
            _myDelegate = value;
        }
    }

    ///<summary>
    /// Call all given callbacks
    ///</summary>
    ///<param name="callbacks">callbacks u want to call</param>
    public void MyCallbacks(params MyDelegate[] callbacks)
    {
        if (callbacks != null)
        {
            foreach (MyDelegate callback in callbacks)
            {
                if (callback != null)
                {
                    callback.Invoke(null);
                }
            }
        }
    }

    ///<summary>
    /// RunTest, if u call this method the defined callback will be raised
    ///</summary>
    public void RunTest()
    {
        if (_myDelegate != null)
        {
            _myDelegate.Invoke("test");
        }
    }

    ///<summary>
    /// MyDelegateCallback, the callback we want to raise
    ///</summary>
    ///<param name="obj"></param>
    private void MyDelegateCallback(object obj)
    {
        System.Windows.MessageBox.Show("Delegate callback called!");
    }

    ///<summary>
    /// MyDelegateCallback1, the callback we want to raise
    ///</summary>
    ///<param name="obj"></param>
    private void MyDelegateCallback1(object obj)
    {
        System.Windows.MessageBox.Show("Delegate callback (1) called!");
    }
}

///<summary>
/// MyDelegate, the delegate function
///</summary>
///<param name="obj"></param>
public delegate void MyDelegate(object obj);
公共类MyClass
{
//MyDelegate回调持有者
私人MyDelegate_MyDelegate;
//单件夹持器
私有静态易失性MyClass_实例;
///
///实例属性
///
公共静态MyClass实例
{
得到
{
if(_instance==null)
{
_实例=新的MyClass();
}
_MyCallbacks(_instance.MyDelegateCallback,_instance.MyDelegateCallback1);
返回_实例;
}
}
///
///实例多回调调用者
///
///要呼叫的calbacks
///我的班级
公共静态MyClass实例(参数MyDelegate[]回调)
{
if(_instance==null)
{
_实例=新的MyClass();
}
_MyCallbacks(callbacks);
返回_实例;
}
///
///MyClass构造函数
///
私有MyClass()
{
//定义回调函数
MyDelegate=MyDelegateCallback;
}
///
///MyDelegate属性,在这里您可以将回调更改为与MyDelegate结构匹配的任何函数
///
公共MyDelegate MyDelegate
{
得到
{
返回我的委托;
}
设置
{
_myDelegate=值;
}
}
///
///调用所有给定的回调
///
///回拨你想打的电话
公共void MyCallbacks(参数MyDelegate[]回调)
{
if(回调!=null)
{
foreach(回调中的MyDelegate回调)
{
if(回调!=null)
{
callback.Invoke(null);
}
}
}
}
///
///RunTest,如果调用此方法,将引发已定义的回调
///
公共无效运行测试()
{
如果(_myDelegate!=null)
{
_myDelegate.Invoke(“测试”);
}
}
///
///MyDelegateCallback,我们要发起的回调
///
///
私有void MyDelegateCallback(对象obj)
{
System.Windows.MessageBox.Show(“调用了代理回调!”);
}
///
///MyDelegateCallback1,我们要发起的回调
///
///
私有void MyDelegateCallback1(对象obj)
{
System.Windows.MessageBox.Show(“调用了委托回调(1)”;
}
}
///
///MyDelegate,委托函数
///
///
公共委托无效MyDelegate(对象obj);

我更新了我的答案,看看
MyCallbacks(params MyDelegate[]callbacks)
。它将调用与
MyDelegate
结构匹配的不同回调
编辑:
添加
MyClass.Instance
&
MyClass.Instance(params MyDelegate[]callbacks)

您是否考虑过使用方面库?根据您的问题,您似乎真的可以用这种方法解决您的问题

例如,您可以在此处使用,只需派生,并处理四个可用的主事件:

或另外两个:

  • 恢复
  • 奥尼菲尔德
或其中任何一种。简单模式如下:

int MyMethod(object arg0, int arg1)
{
    OnEntry();
    try
    {
        // YOUR CODE HERE 
        OnSuccess();
        return returnValue;
    }
    catch ( Exception e )
    {
        OnException();
    }
    finally
    {
        OnExit();
    }
}
因此,您可以轻松调用
Callback
函数(并且可以在
OnSuccess
方法中提取运行时传递的参数:

public override void OnSuccess(MethodExecutionArgs args)
{
    CallBack(GetValueYouNeed(args));
}

PostSharp的简单版本是一个免费的许可证,分发和记录良好,因此我强烈建议您研究这种方法。

一些示例代码可能很有用。实际上,您想要什么还很不清楚。例如,
beforeFilter
应该是cal吗