2009-09-04 66 views
0

我是新来枚举集合,所以原谅这个问题听起来很愚蠢。从接口类调用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之外的地址即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':显式接口声明只能声明d在一个类或结构中

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

+0

你的Person类是否实现IEnumerable(如果是的话,它应该是某种集合)并且名称不适合。你想用PersonStuff中声明的GetEnumerator函数来实现什么? – 2009-09-04 02:09:08

+0

Person类没有实现IEnumerable,但是PersonStuff做到了。我想枚举Person对象中的项目。 PersonStuff创建Person对象并使用它。 – user159603 2009-09-04 02:20:31

+0

你描述的实现将迭代多个'Person'对象,而不是单个人内部的项目。如果我误解了,你是否可以发布一个你想如何使用IEnumerable实现的例子,如果你能使它工作? – jeremyalan 2009-09-04 22:14:32

回答

5

IPersonStuff本身集合样,或只是一堆属性?如果它不是集合式的,那就没有必要让它变得可枚举。

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

我认为如果你想IPersonStuff是可枚举的,那么你可以让IPersonStuff继承IEnumerable<T>(它继而继承IEnumerable)。否则,我认为您可以使用foreach而不是对IPersonStuff的引用。

编辑基础上进一步评论和编辑,它看​​起来像PersonStuff旨在集合类data access classPerson,用实例在monostate方式管理。

的实例化的Monostate击败定义一个接口IPersonStuff的一点:如果你总是有在线new PersonStuff()创建它,然后(巴bytecode postprocessing)没有机会使用该接口的一些非默认的实现。

我会建议定义某种类型的数据访问上下文对象,其中包含表示每个全局实体集合的属性,然后在您选择的时尚中传递 - 使用基于参数或访问器的单例优于单一。这个对象可能会包装一个数据库连接,NHibernate会话或类似的东西。

+0

+1。 “...非泛型IEnumerable因此不在范围内。” – Fung 2009-09-04 02:12:35

+0

IPersonStuff设置/获取对象Person的值(并使用数据库)。 Person本质上是一个getter/setter类。我想枚举Person类中的项目。 – user159603 2009-09-04 02:16:26

+0

我的意思是,我想枚举Person对象持有的项目。 – user159603 2009-09-04 02:17:08

0

你得到的错误最可能是因为像杰弗里说你错过了System.Collections.Generic其中有非通用IEnumerable的参考。一旦你有正确的参考,你将不需要0​​演员。

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

如果你正在枚举你的类的属性,那么一个很好的诀窍就是在Person.GetEnumerator()中为每个属性使用yield return(而不是编写实现IEnumerator的自定义类)。

+0

对不起,是的,我已经修改了最初的问题,以照顾不同类型(非泛型IEnumerable)。我可以通过接口类IPersonStuff调用它吗? – user159603 2009-09-04 22:07:42