基本的にイベントをアプリの JavaScript 部分にルーティングする、さまざまなイベントの共通ハンドラーを宣言したいと思います。私自身は JS/AS3 のバックグラウンドがあり、このようなことは比較的簡単に行うことができます。ただし、SilverLight と C# はかなり厳密に見えます。
計画は次のようになります。JSは、インスタンス化するクラス名と呼び出すメソッドを文字列引数として使用して、特別な[ScriptableMember]を呼び出します。[ScriptableMember]は次に、クラスのインスタンスを構築し、オプションで、そのインスタンスによって起動できるイベントをサブスクライブする必要があります。サブスクライブするイベントは、何らかの public static 構造体で公開されます。[ScriptableMember]は、その構造体からイベント プロパティを抽出し、単一のイベント ハンドラーでそれらすべてにサブスクライブする必要があります。共通の単一イベント ハンドラーは、C# イベントを JS イベントに変換する必要があります。
明らかに、ある種のファクトリ ロジックですべてを一般化し、自動化する必要があります。
これに関する大きな問題の 1 つは、デリゲートまたは 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 ...
}