2

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

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);
    }

}
4

0 回答 0