我想为各种事件声明通用处理程序,这基本上会将事件路由到应用程序的 JavaScript 部分。我自己是为 JS/AS3 背景而来的,在这种情况下,这样的事情做起来相对简单。SilverLight 和 C# 看起来相当严格。
计划如下,JS 将调用一个特殊的[ScriptableMember]并带有要实例化的类名和要调用的方法,作为字符串参数。[ScriptableMember]然后必须构造该类的实例并可选择订阅可由该实例触发的事件。要订阅的事件将在某种公共静态结构中公开。[ScriptableMember]必须从该结构中提取事件属性并使用单个事件处理程序订阅所有这些属性。通用的单个事件处理程序应该将 C# 事件转换为 JS 事件。
显然,一切都应该在某种工厂逻辑中通用化和自动化。
一个大问题是我无法事先知道委托或 EventArgs 对象的类型。即使我知道为每个案例都创建一个超载会很麻烦。无论如何要在 C# 中定义通用事件处理程序吗?
更新:
这是处理所描述逻辑的代码片段:
[ScriptableMember]
public void exec(string compName, string action, ScriptObject scriptObject)
{
String compFQName;
Type compClass;
object comp;
compFQName = "fully.qualified.name." + compName;
compClass = Type.GetType(compFQName);
if (compClass != null) {
comp = Activator.CreateInstance(compClass);
FieldInfo fieldInfo = compClass.GetField("dispatches", BindingFlags.Static | BindingFlags.Public);
object[] dispatches = (object[])fieldInfo.GetValue(comp);
if (dispatches != null) {
foreach (string eventName in dispatches) {
EventInfo eventInfo = compClass.GetEvent(eventName);
Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, "OnComponentEvent");
eventInfo.AddEventHandler(comp, handler);
}
}
}
// ...
}
然后有一个事件处理程序应该赶上所有的事件:
public void OnComponentEvent(object sender, EventArgs args)
{
// do something ...
}