2009-09-04 65 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