C#中的C ++ Style回调函数

时间:2011-12-01 11:34:26

标签: c# delegates callback

我可能只是很厚,但我不知道该怎么做......

我有一个我正在尝试创建的库,它将具有一个虚拟函数,用户可以使用该函数创建一个自定义错误处理程序,以便稍后在代码中调用。我遇到的主要问题之一是这些错误将存储在一个集合中以便随机调用。

这是一些伪代码

class Error
{
    string Error {get; set;}
    int ErrorCode {get; set;}

    public void ErrorFunction(params obj[] arrParams);
}


class program
{
    List<Error> errorlist = new List<Error>();

    static void Main(string[] args)
    {
         initList();
         errorlist[0].ErrorFunction("Sometext");         
    }

    public void initList()
    {

         Error err = new Error();
         err.ErrorFunction = MyOverloadedError;

         errorlist.add(err);
    }

    public void MyOverloadedError(params obj[] arrObjects)
    {
         Console.WriteLine(arrObjects); 
    }
}

我似乎记得能够用一个简单的方法做到这一点 void *和使用addressof调用以分配要调用的函数。

就像我说的,也许我很厚,我知道我必须使用委托,但我无法弄清楚如何定义一个委托,它存在于类的实例中而不是作为类的静态成员。

要重申(因为我累了,不确定我是否明白或者更加混乱)我想制作一个可以分配自定义功能的成员函数。

基本上我可以做以下

Error myError = new Error();
myError.ErrorFunction = SomeCustomFunction;
...
myError.ErrorFunction("Some Parameters"); //effectively calling some static function elsewhere

提前致谢!我的大脑疼得太厉害了....

2 个答案:

答案 0 :(得分:3)

不确定要实现的目标或事件是否更合适,但这是您的pseude-code,修复有效,正在使用C#代码:

delegate void ErrorDelegate(params object[] arrParams);
class Error
{
    string ErrorText { get; set; }
    int ErrorCode { get; set; }

    public ErrorDelegate ErrorFunction;
}

static class Program
{
    static List<Error> errorlist = new List<Error>();

    static void initList()
    {

        Error err = new Error();
        err.ErrorFunction = MyOverloadedError;

        errorlist.Add(err);
    }


    static void MyOverloadedError(params object[] arrObjects)
    {
        Console.WriteLine(arrObjects);
    }

    static void Main(string[] args)
    {
        initList();
        errorlist[0].ErrorFunction("Sometext");     
    }
}

答案 1 :(得分:2)

在这种情况下你应该使用一个事件:

class Error
{
    string Error {get; set;}
    int ErrorCode {get; set;}

    public event EventHandler<ErrorOccurredEventArgs> ErrorOccurred;
}

public void initList()
{

     Error err = new Error();
     err.ErrorOccurred += MyOverloadedError;

     errorlist.add(err);
}

public void MyOverloadedError(ErrorOccurredEventArgs e)
{
     Console.WriteLine(e.Objects); 
}