Передающие параметры слушателям события / обработчики

Я думаю, что Вы хотите:

static object InvokeMethod(Delegate method, params object[] args){
    return method.DynamicInvoke(args);
}

static int Add(int a, int b){
    return a + b;
}

static void Test(){
    Console.WriteLine(InvokeMethod(new Func<int, int, int>(Add), 5, 4));
}

Печать "9".

10
задан Daniel Carvalho 23 September 2009 в 12:07
поделиться

7 ответов

Да, я понимаю, о чем вы. Что я делаю, так это продлеваю событие и отправляю настраиваемое событие. Таким образом, я могу создавать свойства в настраиваемом событии, содержащие необходимые данные. Вроде чисто, но требует немного усилий. Это не идеально, но я не знаю значительно лучшего способа.

2
ответ дан 4 December 2019 в 03:16
поделиться

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

В этом случае я бы сохранил URL-адреса и фрагменты роликов в двух отдельных массивах уровня класса и использовал бы

var url:String = urlArray[mcArray.indexOf(event.target)];

внутри обработчик событий для получения URL.

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

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

Если MovieClip необходимо отслеживать дополнительную информацию, которую вы должны знать, когда по нему щелкают, я бы использовал более формализованную версию вашей техники лепрекона.

Я бы создал новый класс, называемый чем-то вроде SpecialImage, который расширяет MovieClip и имеет свойство для хранения URL-адреса для загрузки.

В зависимости от того, как создаются ваши SpecialImages, вы можете либо создать их в коде, либо связать MovieClip в вашей библиотеке с этим классом.

По сути, это шикарный лепрекон, но поскольку информация напрямую связана с изображением MovieClip, хранить их вместе кажется лучшим вариантом.

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

Вы можете сделать следующее, что по сути является более чистым способом передачи пользовательских данных.

example code:
public function myCustomEvenListener(e:MouseEvent,myCustomData:Object)
{
//Do whatever you wnat with myCustomData Object here...
}
//this is the function where you add event listeners to components..
public function init():void
{
var myCustomObject:Object=new Object();
myCustomObject.url="http://xyz.com/image.jsp";
myCustomObject.anydata="You can Add anything here";

mycomponent.addEventListener(MouseEvent.CLICK,function (e:MouseEvent) : void {
                  myCustomEventListener(e,myCustomObject);
            });

}

Это просто еще один способ использования анонимных функций ....

0
ответ дан 4 December 2019 в 03:16
поделиться

Вы можете использовать то, что называется «Делегаты», если вам не нравится хранить данные в целевом члене. Ни один из них не лучше другого. В основном это просто предпочтения.

Вот пример класса делегата (ничего встроенного): http://www.actionscript.org/resources/articles/205/1/The-Delegate-Class/Page1.html

Вероятно, это лучшая идея, если диспетчер событий не ваш собственный класс. В противном случае сохранение переменной в вашем собственном классе - неплохая идея. Просто стиль ООП.

Ура.

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

It is probably better practice to make a custom class that extends MovieClip for your thumnbnail, and have that thumbnail dispatch a custom Event class that has a place to store your data:

Make a custom URLEvent that can store the url property along with the event

package{

import flash.events.Event;

public class URLEvent extends Event{

    public var url:String;
    public static const CLICK:String = "URLEventClick"

    public function URLEvent(type:String, url:String = "", bubbles:Boolean = false, cancelable:Boolean=false){
        super(type, bubbles, cancelable);
        this.url = url;
    }

    override public function clone():Event{
        return new URLEvent(type,url,bubbles,cancelable);
    }
  }
}

Make a custom thumbnail class that can store the url variable, and sends a URLEvent when clicked:

package{

import flash.display.MovieClip;
import flash.events.MouseEvent;

public class Thumbnail extends MovieClip{

    protected var url:String;

    public function Thumbnail(url:String){
        this.url = url;
        addEventListener(MouseEvent.CLICK,clickHandler);
    }

    //the thumbnail captures its own click and dispatches a custom event
    protected function clickHandler(event:MouseEvent):void{
        dispatchEvent(new URLEvent(URLEvent.CLICK,url));
    }

}

Now you can use your Thumbnail class to load each image:

tempThumb.addEventListener(URLEvent.CLICK,tempThumbClickHandler);

function tempThumbClickHandler(event:URLEvent):void{
//we can get the url property direct from the URLEvent
    loadImage(event.url);
}

This method is much better OOP practice, as you do not need to know what type of object your event.target is - you know from the event type exactly what type of data will be sent with each event.

0
ответ дан 4 December 2019 в 03:16
поделиться

Если бы я искал эту функциональность, а я часто ищу, я бы сделал tempThumb классом, несущим свойство url. затем:

MyThumbClass(event.target).url //in the MouseEvent.CLICK handler

Строгая типизация, легкий доступ, чистый синтаксис, низкая сложность.

0
ответ дан 4 December 2019 в 03:16
поделиться
Другие вопросы по тегам:

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