C# 从接口类调用IEnumerator

C# 从接口类调用IEnumerator,c#,generics,interface,ienumerator,C#,Generics,Interface,Ienumerator,我不熟悉列举收藏,所以如果这个问题听起来很愚蠢,请原谅 我有课 public class PersonStuff : IPersonStuff, IEnumerable<User> { Person person = new Person(); ... IEnumerator<Person> IEnumerable<Person>.GetEnumerator() {

我不熟悉列举收藏,所以如果这个问题听起来很愚蠢,请原谅

我有课

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

        IEnumerator<Person> IEnumerable<Person>.GetEnumerator()
        {
            return (person as IEnumerable<Person>).GetEnumerator();
        }
}
但是,我得到以下错误:

  • “IEnumerable.GetEnumerator”:只能在类或结构中声明显式接口声明

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

ipersonstaff本身是一个集合,还是一堆属性?如果它不是像集合一样的,就没有必要使其可枚举

我认为错误是由于
使用System.Collections.Generic
,而不是
System.Collections
——因此非泛型
IEnumerable
不在范围之内

我认为,如果您希望
ipersonstaff
是可枚举的,那么您可以让
ipersonstaff
继承
IEnumerable
(这反过来又继承
IEnumerable
)。否则,我认为您将无法将
foreach
用于对
ipersonstaff
的引用

编辑根据进一步的评论和编辑,它看起来像是
personstaff
的集合,类似于
Person
,以时尚的方式管理实例化

单状态实例化无法定义接口
ipersonstaff
:如果总是使用
new personstaff()
联机创建接口,那么(bar)就没有机会使用该接口的一些非默认实现


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

IPersonStuff
本身类似于集合,还是只是一组属性?如果它不是像集合一样的,就没有必要使其可枚举

我认为错误是由于
使用System.Collections.Generic
,而不是
System.Collections
——因此非泛型
IEnumerable
不在范围之内

我认为,如果您希望
ipersonstaff
是可枚举的,那么您可以让
ipersonstaff
继承
IEnumerable
(这反过来又继承
IEnumerable
)。否则,我认为您将无法将
foreach
用于对
ipersonstaff
的引用

编辑根据进一步的评论和编辑,它看起来像是
personstaff
的集合,类似于
Person
,以时尚的方式管理实例化

单状态实例化无法定义接口
ipersonstaff
:如果总是使用
new personstaff()
联机创建接口,那么(bar)就没有机会使用该接口的一些非默认实现


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

您之所以会出现错误,很可能是因为正如Jeffrey所说,您缺少对
System.Collections.Generic
的引用,其中包含非Generic
IEnumerable
。一旦您有了正确的引用,您就不需要强制转换
(person as IEnumerable)

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


如果您要枚举类的属性,那么一个很好的技巧就是亲自为每个属性使用
返回
(而不是编写实现IEnumerator的自定义类)

您之所以会出现错误,很可能是因为正如Jeffrey所说,您缺少对
System.Collections.Generic
的引用,其中包含非Generic
IEnumerable
。一旦您有了正确的引用,您就不需要强制转换
(person as IEnumerable)

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


如果您要枚举类的属性,那么一个很好的技巧就是亲自为每个属性使用
返回
(而不是编写实现IEnumerator的自定义类)

Person类是否实现了IEnumerable(如果是,则应该是某种集合),并且名称不合适。使用PersonStuff中声明的上的GetEnumerator函数,您试图实现什么?Person类不实现IEnumerable,但PersonStuff实现。我想枚举Person对象中的项。PersonStuff创建Person对象并使用它。您描述的实现将迭代多个
Person
对象,而不是单个对象中的项
interface IPersonStuff
    {
        ...
        IEnumerator<Person>  IEnumerable<Person>.GetEnumerator();
    }
    IPersonStuff personStuff = new PersonStuff();

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