Функции обратного вызова в стиле C ++ в C # - PullRequest
0 голосов
/ 01 декабря 2011

Я, наверное, просто толстый, но не могу понять, что здесь делать ...

У меня есть библиотека, которую я пытаюсь создать, которая будет иметь виртуальную функцию, которую пользователь может использовать для создания пользовательского обработчика ошибок для последующего вызова в коде. Одна из главных ошибок, с которыми я сталкиваюсь, заключается в том, что эти ошибки будут храниться в коллекции для случайного вызова.

Вот какой-то псевдокод

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 ]

3 голосов
/ 01 декабря 2011

Не уверен, чего вы хотите достичь или подходит ли событие, но вот ваш псевдокод, исправленный, чтобы быть действительным, рабочий код 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");     
    }
}
2 голосов
/ 01 декабря 2011

Вы должны использовать событие в этом случае:

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