所以我试图编写一种保存和调用任何类型的委托方法的方法。这里有一些真正的代码来展示我正在努力实现的目标:
public class Bar {
public Bar(){
addEvent<Action<string>>(baz);
callEvent<Action<string>, string>("Stuff");
}
List<object> fullList = new List<object>();
void addEvent<T>(T method){
fullList.Add(new List<T>());
((List<T>) fullList[0]).Add(method);
}
void callEvent<T1, T2>(T2 input){
if (!typeof(T1).IsSubclassOf(typeof(Delegate)))
{
throw new InvalidOperationException(typeof(T1).Name + " is not a delegate type");
}
T1 method = ((List<T1>) fullList[0])[0];
Console.WriteLine(method);
}
void baz(string str){
Console.WriteLine(str);
}
}
(我尝试过使用Action [object],但它/ /它/不想被强制转换为Action [string],所以我放弃了那条路线)
反正。到目前为止看起来都不错。但是,我找不到任何方法来实际调用'方法' - 最后一个变量。更重要的是,C#不允许T1的委托类型约束,或者允许调用Invoke。
有人能想到一个解决方法吗?
非常感谢
编辑:现在的输出是“System.Action`1 [System.String]”
修改
没关系。解决了我自己的问题。我知道所有代表的形式都是Action [T,...]所以我只是基于那个
public class Bar : MyClass {
public Bar(){
addEvent<string>(baz);
callEvent<string>("Stuff");
}
List<object> fullList = new List<object>();
void addEvent<T>(Action<T> method){
fullList.Add(new List<Action<T>>());
((List<Action<T>>) fullList[0]).Add(method);
}
void callEvent<T>(T input){
Action<T> method = ((List<Action<T>>) fullList[0])[0];
method(input);
}
void baz(string str){
Console.WriteLine(str);
}
}