none
Как передать метод для вызова в другой класс? RRS feed

  • Вопрос

  • пример:

    public class classA
    {
         List<classB> list=new List<classB>();
         public classA()
         {
            classB _obj1 = new classB();
            _obj1.CallMethod = // указать что в этом элементе вызывать метод method1;
            classB _obj2 = new classB();
            _obj2.CallMethod = // указать что в этом элементе вызывать метод method2;
            list.Add(_obj1);
            list.Add(_obj2);
           
         }
         public int method1(int n) { return 1; }
         public int method2(int n) { return 2; }
        
         void Do()
         {
            foreach(classB item in list)
            {
                // вызвать метод из item.CallMethod и передать параметры
            }
         }
    }
    
    public class classB
    {
         public ... CallMethod=null;
    }

    Правильно ли для реализации этого функционала использовать event EventHandler ?

    или лучше использовать какие-то другие механизмы? Меня смущает что event это событие и он создает промежуточные механизмы для обработки.

    мне в данном случае важна скорость обработки, чтобы метод вызывался сразу без каких-либо задержек.

    11 марта 2015 г. 11:44

Ответы

  • Всё верно.

    Можно короче. Вот это:

    public delegate int MyMethod(int n);
    
    MyMethod CallMethod;

    заменить одной строкой:
    Func<int, int> CallMethod;

    Func, Action и Predicate - предопределённые обобщённые делегаты, уже имеющиеся во фреймворке.
    11 марта 2015 г. 14:12
  • кажется разобрался, вот так скорее всего будет верно:

    public class classA { List<classB> list=new List<classB>(); public classA() { classB _obj1 = new classB(); _obj1.MyMethod = method1; classB _obj2 = new classB(); _obj2.MyMethod = method2; list.Add(_obj1); list.Add(_obj2); } public int method1(int n) { return 1; } public int method2(int n) { return 2; } void Do() { foreach(classB item in list) { // вызвать метод из item.CallMethod и передать параметры int k = item.CallMethod(1); } } } public class classB { public delegate int MyMethod(int n);

    MyMethod CallMethod; }



    11 марта 2015 г. 12:13

Все ответы

  • кажется разобрался, вот так скорее всего будет верно:

    public class classA { List<classB> list=new List<classB>(); public classA() { classB _obj1 = new classB(); _obj1.MyMethod = method1; classB _obj2 = new classB(); _obj2.MyMethod = method2; list.Add(_obj1); list.Add(_obj2); } public int method1(int n) { return 1; } public int method2(int n) { return 2; } void Do() { foreach(classB item in list) { // вызвать метод из item.CallMethod и передать параметры int k = item.CallMethod(1); } } } public class classB { public delegate int MyMethod(int n);

    MyMethod CallMethod; }



    11 марта 2015 г. 12:13
  • Всё верно.

    Можно короче. Вот это:

    public delegate int MyMethod(int n);
    
    MyMethod CallMethod;

    заменить одной строкой:
    Func<int, int> CallMethod;

    Func, Action и Predicate - предопределённые обобщённые делегаты, уже имеющиеся во фреймворке.
    11 марта 2015 г. 14:12