реализации делегатов в C # - PullRequest
0 голосов
/ 01 февраля 2012

Это будет первый раз, когда я буду использовать делегатов в c #, поэтому, пожалуйста, потерпите меня. Я много о них читал, но никогда не думал о том, как / зачем использовать эту конструкцию до сих пор.

У меня есть код, который выглядит следующим образом:

public class DoWork()
{

   public MethodWorkA(List<long> TheList) {}

   public void MethodWork1(parameters) {}

   public void MethodWork2(parameters) {}

}

Я вызываю MethodWorkA из метода вне класса, а MethodWorkA вызывает MethodWork 1 и 2. Когда я вызываю methodA, я хотел бы передать какой-то параметр, чтобы иногда он просто выполнял MethodWork1, а иногда и MethodWork1, и MethodWork2 .

Итак, когда я звоню, звонок выглядит так:

DoWork MyClass = new DoWork();
MyClass.MethodA...

Где в этом вписывается синтаксис делегата?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 01 февраля 2012
public void MethodWorkA(Action<ParamType1, ParamType2> method) {
    method(...);
}

Вы можете вызвать его, используя метод преобразования групп:

MethodWorkA(someInstance.Method1);

Вы также можете создать многоадресный делегат, который вызывает два метода:

MethodWorkA(someInstance.Method1 + someInstance.Method2);
0 голосов
/ 02 февраля 2012

Для того, что вы описали, вам не нужны делегаты.

Просто сделайте что-то вроде этого:

public class DoWork
{
    public void MethodWorkA(List<long> theList, bool both) 
    {
        if (both)
        {
            MethodWork1(1);
            MethodWork2(1);
        }
        else MethodWork1(1);
    }

    public void MethodWork1(int parameters) { }

    public void MethodWork2(int parameters) { }
}

Если вы просто экспериментируете с делегатами, то здесь:*

public partial class Form1 : Form
{
    Func<string, string> doThis;

    public Form1()
    {
        InitializeComponent();
        Shown += Form1_Shown;
    }

    void Form1_Shown(object sender, EventArgs e)
    {
        doThis = do1;
        Text = doThis("a");
        doThis = do2;
        Text = doThis("a");
    }

    string do1(string s)
    {
        MessageBox.Show(s);
        return "1";
    }

    string do2(string s)
    {
        MessageBox.Show(s);
        return "2";
    }
}
0 голосов
/ 02 февраля 2012

Учитывая, что все методы находятся внутри одного класса, и вы вызываете функцию MethodWorkA, используя экземпляр класса, я, честно говоря, не вижу никакой причины в использовании Action<T> или delegate как я понял твой вопрос.

Когда я вызываю methodA, я хотел бы передать какой-то параметр, чтобы иногда он просто делает MethodWork1, а иногда MethodWork1 и MethodWork2.

Почему бы просто не передать простой параметр MethodWorkA, например

public class DoWork()
{

   public enum ExecutionSequence {CallMethod1, CallMethod2, CallBoth};
   public MethodWorkA(List<long> TheList, ExecutionSequence exec) 
   {
       if(exec == ExecutionSequence.CallMethod1) 
         MethodWork1(..);
       else if(exec == ExecutionSequence.CallMethod2)
         MethodWork2(..);
       else if(exec == ExecutionSequence.Both)
       {
          MethodWork1(..);
          MethodWork2(..);
       } 
   }

   public void MethodWork1(parameters) {}

   public void MethodWork2(parameters) {}

}

Намного проще и понятнее для вашего класса.

Если это не то, что вы хотите, пожалуйста, объясните.

РЕДАКТИРОВАТЬ

Просто чтобы дать вам представление о том, что вы можете сделать:

Пример:

public class Executor {

     public void MainMethod(long parameter, IEnumerable<Action> functionsToCall) {
            foreach(Action action in functionsToCall) {
                  action();
            }
     }
}

и в коде

void Main()
{
    Executor exec = new Executor();
    exec.MainMethod(10, new List<Action>{()=>{Console.WriteLine("Method1");}, 
                                         ()=>{Console.WriteLine("Method2");}
    });
}

Выход будет

Method1
Method2

Таким образом, вы, например, можете вставить в коллекцию только те функции, которые хотите выполнить. Конечно, в этом случае логика решения (какие функции должны быть выполнены) определяется вне вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...