【发布时间】:2018-05-09 19:11:10
【问题描述】:
我有一个将通用委托存储到对象列表中的解决方案,但是有没有办法将它们存储在类型列表中并避免强制转换? 我找不到任何办法,而且总是出现“找不到命名空间 T”之类的错误。
class TestClass {
public delegate void dEvent<T>(object sender, T value);
// is it possible to store the generic delegate directly ?
// List<dEvent<T>> eventlist = new List<dEvent<T>>();
List<object> objLst = new List<object>();
public void Subscribe<T> (dEvent<T> ev){
if (objLst.Contains(ev) == false)
objLst.Add(ev);
}
public void InvokeAll<T>(object sender, T value) {
foreach (var d in objLst.Where(o => (o as dEvent<T>) != null)) {
(d as dEvent<T>).Invoke(sender, value);
}
}
static public void StringSubscriber(object sender, string value) {
Debug.WriteLine(value);
}
static public void IntSubscriber(object sender, int value) {
Debug.WriteLine(value);
}
static public void RunTest() {
TestClass testClass = new TestClass();
testClass.Subscribe<string>(StringSubscriber);
testClass.Subscribe<int>(IntSubscriber);
testClass.InvokeAll<string>(testClass, "Hello");
testClass.InvokeAll<string>(null, "World");
testClass.InvokeAll<int>(testClass, 4);
testClass.InvokeAll<int>(null, 2);
}
}
【问题讨论】: