Анонимные методы и делегаты

В настоящее время на Github есть несколько помощников для Laravel 4. Если это все еще проблема с Aptana, я бы предложил использовать этот пакет: https://github.com/barryvdh/laravel-ide-helper

Я использую Eclipse, и это действительно помогло мне.

14
задан abatishchev 24 February 2012 в 22:31
поделиться

3 ответа

Класс делегата является базовым классом для типов делегатов. Однако только система и компиляторы могут явным образом быть производными от класса Delegate или от класса MulticastDelegate. Также недопустимо наследовать новый тип от типа делегата. Класс делегата не считается типом делегата ; это класс, используемый для получения типов делегатов. Источник - MSDN

Следовательно, необходимо явное приведение к типу, производному от делегата. Вы столкнетесь с этой конкретной ошибкой компилятора, когда передадите анонимный метод для параметра типа System.Delegate - к счастью, это редкий сценарий. Это слишком большая гибкость.

delegate void MyDelegate();

  static void DoSomething_Flexible(Delegate d)
  {   d.DynamicInvoke();      }
  static void DoSomething_Usable(MyDelegate d)
  {   d();      }
  static void Main(string[] args)
  {
     // requires explicit cast else compile error Error "Cannot convert anonymous method to type 'System.Delegate' because it is not a delegate type    
     DoSomething_Flexible((MyDelegate) delegate { Console.WriteLine("Flexible is here!"); });  

     // Parameter Type is a .NET Delegate, no explicit cast needed here. 
     DoSomething_Usable(delegate { Console.WriteLine("Usable is here!"); });
  }

Подробнее об этом на этой странице Яна Гриффита . (См. Пункты после заголовка Примечания)

7
ответ дан 1 December 2019 в 09:33
поделиться

Вам нужно указать компилятору, какой тип делегата нужно создать, поскольку Invoke (и т. д.) просто возьмите Delegate (а не что-то более конкретное).

Чтобы применить к самой большой аудитории, MethodInvoker - удобный тип делегата

BeginInvoke((MethodInvoker) delegate(...) {...});

Однако ... BackgroundWorker.ProgressChanged запускается в потоке пользовательского интерфейса автоматически, так что вам это даже не нужно.

16
ответ дан 1 December 2019 в 09:33
поделиться

Большую часть времени вы имеете дело либо с делегатом без параметров, либо с предикатом в эти случаи. Самый простой способ отсортировать это - привести ваш анонимный метод непосредственно к Action или Predicate соответственно; вам просто не нужно создавать собственный тип делегата для таких простых вещей.

Таким образом, у вас будет что-то вроде

BeginInvoke((Action)delegate(){YourCode.DoSomething();});

или

BeginInvoke((Predicate)delegate(object yourParameter){return YourCode.IsTheParameterSomething(yourParameter)});

HTH

5
ответ дан 1 December 2019 в 09:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: