从Interface类调用IEnumerator

时间:2009-09-04 02:03:43

标签: c# generics interface ienumerator

如果这个问题听起来很愚蠢,我是新来的枚举集合,请原谅。

我有一个班级

public class PersonStuff : IPersonStuff, IEnumerable<User>
    {
        Person person = new Person();
        ...

        IEnumerator<Person> IEnumerable<Person>.GetEnumerator()
        {
            return (person as IEnumerable<Person>).GetEnumerator();
        }
}

如您所见,我在上面实现了两个接口:一个是IPersonStuff,另一个是IEnumerable。

Person类是一个简单的getter / setter,每个类型都是字符串,例如名称,地址除dateofbirth以外的日期时间。

在我的IPersonStuff中我有这个:

interface IPersonStuff
    {
        ...
        IEnumerator<Person>  IEnumerable<Person>.GetEnumerator();
    }

一旦工作,我想以下列方式(来自任何一个班级)来称呼它:

    IPersonStuff personStuff = new PersonStuff();

    foreach (Person u in personStuff)
    {
        //this loop should iterate thru the elements.
    }

但是,我收到以下错误:

  • 'IEnumerable&lt; ...&gt; .GetEnumerator':显式接口声明只能在类或结构中声明

基本上我想知道如何通过IPersonStuff接口调用我在PersonStuff类中的IEnumerator IEnumerable.GetEnumerator()。

2 个答案:

答案 0 :(得分:5)

IPersonStuff本身是集合,还是只是一堆属性?如果它不像集合那样,则无需使其可枚举。

我认为错误是由于using System.Collections.Generic而不是System.Collections - 因此非通用IEnumerable不在范围内。

我认为,如果您希望IPersonStuff可枚举,那么您可以IPersonStuff继承IEnumerable<T>(继而IEnumerable)。否则,我认为您无法使用foreach而不是IPersonStuff的引用。

编辑根据进一步的评论和修改,PersonStuff似乎是Person的集合data access class,其中实例化管理monostate时尚。

monostate实例化失败了界定IPersonStuff的界限:如果你总是用new PersonStuff()内联创建它,那么(bar bytecode postprocessing)就没有机会使用一些接口的非默认实现。

我建议使用表示每个全局实体集合的属性来定义某种数据访问上下文对象,然后以您选择的方式传递它 - 使用参数或基于访问器的单例优于单值。然后,该对象可以包装数据库连接,NHibernate会话等。

答案 1 :(得分:0)

您最有可能收到错误,因为像杰弗里所说的那样,您错过了对System.Collections.Generic具有非通用IEnumerable的引用。获得正确的引用后,您将不需要(person as IEnumerable)

的演员表

是否应该/可以是类型安全取决于您的情况。如果您要枚举的所有元素属于同一类型(即固定类,接口或子类),那么您应该/可以使用类型safe IEnumerable。但是,如果说你想要枚举Person中的所有属性(这听起来像你可能正在尝试的那样)并且你正在返回diff类型,那么你将不得不使用非泛型IEnumerable

如果你通过类的属性进行枚举,那么一个很好的技巧就是在Person.GetEnumerator()中为每个属性使用yield return(而不是编写实现IEnumerator的自定义类);