Как реализовать пользовательские события в F # на компактной основе? - PullRequest
1 голос
/ 05 сентября 2010

Я пытался следовать примеру, приведенному на MSDN , но мой код не компилируется на компактной платформе.Тем не менее, он компилируется на обычной платформе.

type StorageComponent(game) =
    inherit GameComponent(game)

let title_storage_acquired_event = new Control.DelegateEvent<StorageEventHandler>()

Сообщение об ошибке:

Тип 'DelegateEvent' не определен

Ответы [ 2 ]

3 голосов
/ 05 сентября 2010

Судя по подсказке Брайана, типы DelegateEvent<'Delegate> и Event<'Delegate, 'Args> не поддерживаются в .NET Compact Framework. Это будет означать, что вы не можете объявить событие, которое использует явно указанный тип делегата.

Однако вы все равно можете использовать тип Event<'T>, который создает событие типа Handler<'T> (это тип общего делегата, представляющий методы с двумя параметрами типов obj и 'T):

type StorageComponent(game) = 
  inherit GameComponent(game) 

  let titleStorageAcquiredEvent = 
    new Event<StorageEventArgs>() 

  [<CLIEvent>] // If you want to create C# compatible event
  member x.TitleStorageAcquired = 
    titleStorageAcquiredEvent.Publish()

Предполагая, что объявление StorageEventHandler выглядит следующим образом:

delegate void StorageEventHandler(object sender, StorageEventArgs args);

Приведенный выше пример должен создать более или менее эквивалентный код (с той лишь разницей, что он использует общий тип делегата Handler<_> вместо вашего собственного StorageEventHandler).

0 голосов
/ 05 сентября 2010

Если вы посмотрите на код в ОСАГО

C:\Program Files (x86)\FSharp-2.0.0.0\source\fsharp\FSharp.Core\event.fs

он предложит некоторые подсказки (я предполагаю, что в NETCF нет del.DynamicInvoke). Это могло бы также предложить подсказки относительно того, что сделать вместо этого; Я не уверен, но, надеюсь, кто-то другой ответит полным ответом.

...