我有一个通用方法
public delegate void Handler<T>(T val);
我使用户能够注册事件并提供此委托。我需要根据他们的类型保存委托列表。
我尝试保存在类型和对象的字典中。添加方法时,我将其转换为
List<Handler<T>>
根据 T. 但是当事件发生时我没有 T 所以不能转换到相关的通用处理程序列表(我有 Type 但没有 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 });
}
}
}
}
但问题是这种方法只有在方法是 static 时才有效,否则它将需要类的类型。
这个问题有解决办法吗???
启用通用事件...谢谢!