2012-02-01 3 views
0

Это будет первый раз, когда я буду использовать делегатов в C#, поэтому, пожалуйста, несите меня. Я много читал о них, но никогда не думал о том, как/почему использовать эту конструкцию до сих пор.выполнение делегатов в 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... 

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

Спасибо.

+0

Можете ли вы объяснить, почему вам нужно здесь любой 'delegate', или вы путайте здесь что-то, или вопрос не завершен. ? – Tigran

+0

@Tigran: потому что иногда MethodWorkA нужно вызывать Work1 и Work2, и иногда ему нужно только вызвать Work1 – frenchie

ответ

3
public void MethodWorkA(Action<ParamType1, ParamType2> method) { 
    method(...); 
} 

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

MethodWorkA(someInstance.Method1); 

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

MethodWorkA(someInstance.Method1 + someInstance.Method2); 
+0

, а затем в другое время я пишу MethodWorkA (someInstance.Method1, someInstance.Method2)? Где отображается ключевое слово делегата? – frenchie

+0

Ключевое слово 'delegate' используется только для создания нового делегата ** типа **. Вы можете использовать встроенные общие типы «Action <...>» вместо создания типов делегатов. – SLaks

+0

ok ok cool! и в первой строке - метод MethodWorkA (Action ) {«что такое« метод »? – frenchie

0

Учитывая, что все методы в том же класс, и вы вызываете функцию 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) {} 

} 

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

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

EDIT

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

Пример:

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 

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

+0

Ну, моя цель - понять делегатов, используя их. Поэтому я думал, что мой сценарий станет хорошим местом для начала. Я могу обойтись без делегатов (код уже работает без), но я думал переписывать его с делегатами; обучение в процессе работы. – frenchie

+0

@frenchie: см. Мой отредактированный пост, например. Думайте, что вы ищете что-то подобное. – Tigran

0

Для описания вы не нуждаетесь в делегатах.

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

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

Да, это то, что у меня уже есть (очень похоже, у меня есть строка вместо bool для параметра, который сообщает, какую ветку взять). Вместо этого я искал возможности для делегирования делегатов. – frenchie

+0

@frenchie См. Обновление. – ispiro

Смежные вопросы