Список <T>делегатов в классе, который является IEnumerable - PullRequest
1 голос
/ 08 июля 2011

У меня есть определенный пользователем класс, для которого я хочу создать общедоступный список.Я хочу, чтобы список был списком функций делегата, к которому я могу добавить и назначить каждому члену списка функцию делегата.Я хочу, чтобы этот список функций был частью класса, который я создаю, поэтому он следует за экземпляром класса, когда я передаю его другим функциям.Мне нужна возможность вызывать делегированные функции через цикл 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>>();

    }

Я даже не знаю, делает ли это то, что я хочу, или нет.Я знаю, что не могу пройти через это, хотя.Он полностью написан на основе собранного кода от Google.Я едва понимаю, что он должен делать.

Ответы [ 3 ]

2 голосов
/ 08 июля 2011

Я не понимаю, зачем вам вообще нужен собственный класс. Просто используйте 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 голос
/ 08 июля 2011

Я надеюсь, что это полезно для вас.

    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();
    }
1 голос
/ 08 июля 2011

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