0

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

我有一堂课

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 是 DateTime。

在我的 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<...>.GetEnumerator':显式接口声明只能在类或结构中声明

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

4

2 回答 2

5

本身是IPersonStuff类似于集合的,还是只是一堆属性?如果它不是类似集合的,则无需使其可枚举。

我相信错误是由于using System.Collections.Generic但不是System.Collections——非泛型IEnumerable因此不在范围内。

我认为,如果您想IPersonStuff成为可枚举的,那么您可以只拥有IPersonStuff继承IEnumerable<T>(而继承IEnumerable)。否则,我认为您将无法使用foreachIPersonStuff.

编辑基于进一步的评论和编辑,它看​​起来像是PersonStuff一个类似于集合的数据访问类Person单态方式管理实例化。

单态实例化破坏了定义接口的要点IPersonStuff:如果您总是使用new PersonStuff()内联创建它,那么(条形字节码后处理)就没有机会使用接口的某些非默认实现。

我建议定义某种数据访问上下文对象,其属性代表您的每个全局实体集合,然后以您选择的方式传递它——使用参数或基于访问器的单例比单态更可取。然后这个对象可以包装一个数据库连接、NHibernate 会话或类似的东西。

于 2009-09-04T02:09:26.290 回答
0

您收到错误很可能是因为就像 Jeffrey 所说的那样,您缺少对System.Collections.Generic具有非泛型IEnumerable. 一旦你有了正确的参考,你就不需要(person as IEnumerable).

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

如果您正在枚举类的属性,那么一个不错的技巧是yield return在 Person.GetEnumerator(); 中为每个属性使用(而不是编写实现 IEnumerator 的自定义类);

于 2009-09-04T02:28:36.217 回答