Я думаю, что Вы хотите:
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".
Да, я понимаю, о чем вы. Что я делаю, так это продлеваю событие и отправляю настраиваемое событие. Таким образом, я могу создавать свойства в настраиваемом событии, содержащие необходимые данные. Вроде чисто, но требует немного усилий. Это не идеально, но я не знаю значительно лучшего способа.
Анонимных функций лучше избегать, поскольку они могут сделать код неуклюжим и иногда приводить к утечкам памяти. Я бы использовал пользовательские события, если бы я тоже отвечал за отправку события, но здесь это не так.
В этом случае я бы сохранил URL-адреса и фрагменты роликов в двух отдельных массивах уровня класса и использовал бы
var url:String = urlArray[mcArray.indexOf(event.target)];
внутри обработчик событий для получения URL.
Нет ничего плохого в хранении данных в мувиклипе, но я не думаю, что это хороший способ. Но следовать лучшим практикам, даже если они усложняют задачу, тоже не лучшая идея - выбор за вами.
Если MovieClip необходимо отслеживать дополнительную информацию, которую вы должны знать, когда по нему щелкают, я бы использовал более формализованную версию вашей техники лепрекона.
Я бы создал новый класс, называемый чем-то вроде SpecialImage, который расширяет MovieClip и имеет свойство для хранения URL-адреса для загрузки.
В зависимости от того, как создаются ваши SpecialImages, вы можете либо создать их в коде, либо связать MovieClip в вашей библиотеке с этим классом.
По сути, это шикарный лепрекон, но поскольку информация напрямую связана с изображением MovieClip, хранить их вместе кажется лучшим вариантом.
Вы можете сделать следующее, что по сути является более чистым способом передачи пользовательских данных.
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);
});
}
Это просто еще один способ использования анонимных функций ....
Вы можете использовать то, что называется «Делегаты», если вам не нравится хранить данные в целевом члене. Ни один из них не лучше другого. В основном это просто предпочтения.
Вот пример класса делегата (ничего встроенного): http://www.actionscript.org/resources/articles/205/1/The-Delegate-Class/Page1.html
Вероятно, это лучшая идея, если диспетчер событий не ваш собственный класс. В противном случае сохранение переменной в вашем собственном классе - неплохая идея. Просто стиль ООП.
Ура.
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.
Если бы я искал эту функциональность, а я часто ищу, я бы сделал tempThumb классом, несущим свойство url. затем:
MyThumbClass(event.target).url //in the MouseEvent.CLICK handler
Строгая типизация, легкий доступ, чистый синтаксис, низкая сложность.