9 ответов:
MSDN говорит:
этот делегат используется Матрица.Метод ForEach и the Список.Метод ForEach для выполнения действие на каждый элемент массива или список.
кроме того, вы можете использовать его в качестве универсального делегата, который принимает 1-3 параметра без возврата какого-либо значения.
вот небольшой пример, который показывает полезность делегат action
using System; using System.Collections.Generic; class Program { static void Main() { Action<String> print = new Action<String>(Program.Print); List<String> names = new List<String> { "andrew", "nicole" }; names.ForEach(print); Console.Read(); } static void Print(String s) { Console.WriteLine(s); } }обратите внимание, что метод foreach повторяет коллекцию имен и выполняет
Теперь, если вы используете C# 3, Вы можете немного сгладить это с помощью лямбда-выражения:
using System; using System.Collections.Generic; class Program { static void Main() { List<String> names = new List<String> { "andrew", "nicole" }; names.ForEach(s => Console.WriteLine(s)); Console.Read(); } }
Ну одна вещь, которую вы могли бы сделать, это если у вас есть переключатель:
switch(SomeEnum) { case SomeEnum.One: DoThings(someUser); break; case SomeEnum.Two: DoSomethingElse(someUser); break; }и с мощью действий вы можете превратить этот переключатель в словарь:
Dictionary<SomeEnum, Action<User>> methodList = new Dictionary<SomeEnum, Action<User>>() methodList.Add(SomeEnum.One, DoSomething); methodList.Add(SomeEnum.Two, DoSomethingElse);...
methodList[SomeEnum](someUser);или вы могли бы взять это дальше:
SomeOtherMethod(Action<User> someMethodToUse, User someUser) { someMethodToUse(someUser); }....
var neededMethod = methodList[SomeEnum]; SomeOtherMethod(neededMethod, someUser);всего несколько примеров. Конечно, более очевидным использованием будут методы расширения Linq.
вы можете использовать действия для нескольких обработчиков событий:
btnSubmit.Click += (sender, e) => MessageBox.Show("You clicked save!");
я использовал делегат действия, как это в проекте Один раз:
private static Dictionary<Type, Action<Control>> controldefaults = new Dictionary<Type, Action<Control>>() { {typeof(TextBox), c => ((TextBox)c).Clear()}, {typeof(CheckBox), c => ((CheckBox)c).Checked = false}, {typeof(ListBox), c => ((ListBox)c).Items.Clear()}, {typeof(RadioButton), c => ((RadioButton)c).Checked = false}, {typeof(GroupBox), c => ((GroupBox)c).Controls.ClearControls()}, {typeof(Panel), c => ((Panel)c).Controls.ClearControls()} };что все, что он делает, это хранить действие(вызов метода) против типа элемента управления, так что вы можете очистить все элементы управления в форме обратно туда по умолчанию.
Я использую его, когда я имею дело с незаконными вызовами перекрестных потоков, например:
DataRow dr = GetRow(); this.Invoke(new Action(() => { txtFname.Text = dr["Fname"].ToString(); txtLname.Text = dr["Lname"].ToString(); txtMI.Text = dr["MI"].ToString(); txtSSN.Text = dr["SSN"].ToString(); txtSSN.ButtonsRight["OpenDialog"].Visible = true; txtSSN.ButtonsRight["ListSSN"].Visible = true; txtSSN.Focus(); }));Я должен отдать должное Риду Копси, поэтому пользователь 65358 для решения. Мой полный вопрос с ответами Итак, вопрос 2587930
я использовал его в качестве обратного вызова в обработчике событий. Когда я вызываю событие, я передаю метод, принимающий строку параметра. Вот как выглядит поднятие события:
SpecialRequest(this, new BalieEventArgs { Message = "A Message", Action = UpdateMethod, Data = someDataObject });Методика:
public void UpdateMethod(string SpecialCode){ }объявление класса события Args:
public class MyEventArgs : EventArgs { public string Message; public object Data; public Action<String> Action; }таким образом, я могу вызвать метод, переданный из обработчика событий с некоторым параметром для обновления данных. Я использую это, чтобы запросить некоторую информацию от пользователя.
мы используем много функций делегирования действий в тестах. Когда нам нужно построить какой-то объект по умолчанию, а затем нужно его изменить. Я сделал небольшой пример. Для построения объекта по умолчанию person (John Doe) мы используем
Comments