C#调用泛型代理

时间:2013-07-28 16:57:01

标签: c# generics delegates

所以我试图编写一种保存和调用任何类型的委托方法的方法。这里有一些真正的代码来展示我正在努力实现的目标:

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

}

0 个答案:

没有答案