列出IEnumerable类中的代理<t> </t>

时间:2011-07-08 00:49:16

标签: c# class list delegates ienumerable

我有一个用户定义的类,我想创建一个公共列表作为其一部分。我希望List是我可以添加到的委托函数列表,并将每个List成员设置为委托函数。我希望这个函数列表成为我实例化的类的一部分,因此它遵循类的实例,因为我将它传递给其他函数。我需要能够通过foreach循环调用委托函数,因此它也必须是IEnumberable。

我已经尝试了几个小时,我可能会或可能不会完成这项工作的一部分。当它开始看起来我需要为自定义列表编写我自己的IEnumberation例程时,我意识到我已经超越了我的头脑而来到这里。

这是我的代码:

    public delegate List<ChartTestModel> MyDelegate<T>(T i);
    public class DelegateList<T> 
    {
        public void Add(MyDelegate<T> del)
        {
            imp.Add(del);
        }

        public void CallDelegates(T k)
        {
            foreach (MyDelegate<T> del in imp)
            {
                del(k);
            }
        }
        private List<MyDelegate<T>> imp = new List<MyDelegate<T>>();

    }

我甚至不知道这是否符合我的要求。不过,我知道我无法通过它来完成任务。它完全是从拼凑在一起的代码中编写的。我几乎不明白它应该做什么。

3 个答案:

答案 0 :(得分:2)

我不明白为什么你需要一个自定义类。只需使用List<T>,其中T是任何委托类型。

List<Action> actions = new List<Action>();
actions.Add(() => blah blah);
actions.Add(Whatever); // Whatever() is a method

// now run them all
actions.ForEach(a => a());

答案 1 :(得分:1)

IEnumerable<T>易于实现,尤其是当您将集合作为类的成员时。您需要做的就是定义适当的GetEnumerator方法,最简单的方法是返回基础集合的枚举器。

class YourClass : IEnumerable<SomeClass>
{
    List<SomeClass> list = ...

    public IEnumerator<SomeClass> GetEnumerator() 
    {
        return list.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator(); 
    }
}

在这里,您可以隐式为IEnumerable<T>IEnumerable实现隐式方法。 (您必须同时实现IEnumerable<T>继承IEnumerable。)

对于您的特定课程,您可能有

public class DelegateList<T> : IEnumerable<MyDelegate<T>>
{
    // ...other class details 

    private List<MyDelegate<T>> imp = new List<MyDelegate<T>>();

    public IEnumerator<MyDelegate<T>> GetEnumerator()
    {
        return imp.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

答案 2 :(得分:1)

我希望这对你有用。

    static void Main(string[] args)
    {
        var delegateFuncs = new List<Func<string , string>> { 
            l1=>{ return "at1:" + l1;} , 
            l2=>{ return "at2:" + l2;} , 
            l3=>{ return "at3:" + l3;} , 
            l4=>{ return "at4:" + l4;} 
        };

        string parameter = "test";

        foreach (var f in delegateFuncs)
        {
            Console.WriteLine(f(parameter));    
        }

        Console.ReadLine();
    }