Как в C# передать указатель на функцию в конструктор класса?
От: Glorious Россия  
Дата: 29.07.05 14:16
Оценка:
Господа, тут следующая проблема :

Есть нетоторый класс Service, который предоставляет метод Call. И есть некоторый класс Proxy, в котором тоже есть метод Call и этот метод должен вызывать Call из класса Service. Для этого, в классе Proxy есть объект-делегат. Все нормально работает, но только этот делегат приходится создавать явно, обращаясь напрямую к члену класса.
Вопрос: Можно ли сделать так, чтобы этот объект создавался в конструкторе при создании экземпляра класса ? Просто более глупые программисты, использующие эти классы, очень часто забывают создавать этот член-делегат, после чего они получают кучу странных ошибок во время выполнения. Если бы можно создавать делегат в конструкторе класса, передавая ему (конструктору) в качестве параметра функцию, которую должен вызывать делегат, то такие ошибки отлавливались бы еще на стадии компиляции.

Привожу пример программки, которая всё это иллюстрирует :


class Proxy
    {    
        public delegate void CallDelegate(string str);
        public CallDelegate m_CallProxy; // это тот самый член-делегат :))
    
            public void Call(string str) // это вызов функции-делегата
        {
            m_CallProxy(str);
        }
    }
    
    class Service
    {
        // а это функция, которую нужно вызвать
                 public void Call(string str)
        {
            Console.WriteLine("WebServ.str =\"{0}\"",str);
        }
    }
    
    
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
                    
            Service srv = new Service();
            Proxy proxy = new Proxy();
                    
                   // Член - делегат создается непосредственно !
                        
            proxy.m_CallProxy = new  CSharpConsoleTestProject.Proxy.CallDelegate(srv.Call);
       
            proxy.Call("Proxy call");

            while(true);

        }
    }


Вопрос — как можно ли сделать что-нибудь, типа Proxy proxy = new Proxy(srv.Call) ?
Если делать напрямую, то C#-компилятор ругается (думает, что
srv.Call — это вызов функции, но без скобок :))
Или методы в качестве параметров можно передавать только в класс System.Delegate ?

Заранее всем спасибо !
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.