2011-07-08 45 views
1

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

我一直在尝试几个小时,我有可能或不可能完成部分工作。当它开始看起来像我需要为自定义列表编写我自己的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上查看代码来完成的。我几乎不知道它应该做什么。

+0

请添加您拥有的代码,因为它不清楚我的问题是什么。 –

+0

为什么不使用事件模式? http://www.codeproject.com/KB/cs/event_fundamentals.aspx –

回答

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

无法将类型'System.Collections.Generic.List > .Enumerator'隐式转换为'System.Collections.Generic .IEnumerator “ 使用泛型类型 'System.Collections.Generic.IEnumerable ' 需要1个类型参数 使用泛型类型 'System.Collections.Generic.IEnumerator ' 需要1个类型参数 – iniquity

+1

@ user583281:添加'使用System.Collections;'到文件中。 –

+0

啊,我有System.Collections.Generic,但不是它的父母。 – iniquity

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()); 
+0

虽然我怎样才能让这部分课程成为我的课程?我尝试将列表作为公开列表,但它不会显示为我要与之交互的类的属性。 – iniquity

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(); 
    } 
相关问题