所以我试图编写一种保存和调用任何类型的委托方法的方法。这里有一些非常可靠的代码来展示我想要完成的事情:
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);
}
}