c#中的c++风格回调函数

本文关键字:回调 函数 风格 c++ 中的 | 更新日期: 2023-09-27 18:16:33

我可能太笨了,但我不知道该怎么做....

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

下面是一些伪代码

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); 
    }
}

我似乎记得能够简单地用a来做到这一点Void *和使用地址赋值要调用的函数的调用。

就像我说的,也许我太笨了,我知道我必须使用委托,但是我不知道如何定义委托,它存在于类的实例中,而不是作为类的静态成员。

重申一下(因为我很累,不确定我是否说得很清楚,或者只是更令人困惑)我想创建一个成员函数,可以有一个自定义函数分配给它。

所以基本上我可以这样做

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

提前感谢!我的脑子好痛....

c#中的c++风格回调函数

不确定您想要实现的目标或事件是否更合适,但这是您的伪代码,固定为有效,工作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");     
    }
}

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

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); 
}