私は一般的な方法を持っています
public delegate void Handler<T>(T val);
ユーザーがイベントに登録し、このデリゲートを提供できるようにします。タイプに応じてデリゲートのリストを保存する必要があります。
タイプとオブジェクトの辞書に保存してみました。メソッドを追加するとき、私はそれをにキャストします
List<Handler<T>>
Tによると、しかし、イベントが発生したとき、私はTを持っていないので、ジェネリックハンドラーの関連リストにキャストできません(私はタイプを持っていますが、Tは持っていません)
タイプごとにmethodInfoリストを保存することでこれを解決しました
private Dictionary<Type, List<MethodInfo>> handlers = new Dictionary<Type, List<MethodInfo>>();
public delegate void Handler<T>(T val);
public void Register<T>( Handler<T> handler )
{
List<MethodInfo> lst;
if (!handlers.TryGetValue(typeof(T), out lst))
{
lst = new List<MethodInfo>();
handlers.Add(typeof(T), lst);
}
lst.Add(handler.Method);
}
public void RaiseEvent( string value)
{
foreach (KeyValuePair<Type, List<MethodInfo>> pair in handlers)
{
object typedValue;
if (pair.Key.IsEnum)
{
typedValue = Enum.Parse(pair.Key, value);
}
else
{
typedValue = Convert.ChangeType(value, pair.Key);
}
foreach (MethodInfo methodInfo in pair.Value )
{
methodInfo.Invoke(null, new[] { typedValue });
}
}
}
}
ただし、問題は、このアプローチが静的な場合にのみ機能することです。そうでない場合は、クラスの型が必要になります。
この問題の解決策はありますか?
一般的なイベントを有効にします...ありがとう!