2009-09-04 18 views
0

この質問が愚かに聞こえる場合は、コレクションを列挙するのが初めてです。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クラスは、各タイプがストリングの単純なゲッター/セッターです。氏名、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. 
    } 

しかし、私が取得次のエラーが発生しました:

  • 'GetEnumerator':明示的なインターフェイス宣言のみ宣言できますdをクラスまたは構造体に入れる

基本的に私は、IPonStuffインターフェイスを介してPersonStuffクラスにあるIEnumerator IEnumerable.GetEnumerator()を呼び出すことができます。

+0

PersonクラスはIEnumerableを実装していますか?そうであれば、それは何らかのコレクションでなければなりません。その名前は適切ではありません。 PersonStuffで宣言されたGetEnumerator関数で何を達成しようとしていますか? –

+0

PersonクラスはIEnumerableを実装していませんが、PersonStuffは実装しています。 Personオブジェクトのアイテムを列挙したいと思います。 PersonStuffはPersonオブジェクトを作成し、それを処理します。 – user159603

+0

あなたが記述した実装は、複数の 'Person'オブジェクトに対して反復処理を行い、一人の人の内部の項目は反復処理しません。私が誤解している場合は、IEnumerable実装を使用する方法の例を投稿してもらえますか? – jeremyalan

答えて

5

IPersonStuff自体はコレクションのようなものか、それがコレクションのようなものでなければ、それを列挙できるようにする必要はありません。

エラーはusing System.Collections.Genericであると考えられますが、System.Collectionsではないと思われます。したがって、非汎用のIEnumerableは範囲外です。

私はあなたがIPersonStuffを列挙したいならば、あなただけの(順番にIEnumerableを継承)IPersonStuff継承IEnumerable<T>を持つことができると思います。それ以外の場合はIPersonStuffへの参照にはforeachを使用することはできません。さらにコメントや編集に基づいて

EDITPersonStuffmonostate的に管理インスタンス化して、Personのためのコレクションのようなdata access classであることを意図しているように、それが見えます。

monostateのインスタンスは、インタフェースIPersonStuffを定義するポイントを敗北:あなたは常にインラインnew PersonStuff()でそれを作成した場合、その後、(バーbytecode postprocessing)インターフェースのいくつかの非デフォルトの実装を使用する機会はありません。

グローバル・エンティティ・コレクションのそれぞれを表すプロパティを持つデータ・アクセス・コンテキスト・オブジェクトを定義し、ファッションを選択して渡すことをお薦めします。パラメータまたはアクセサ・ベースのシングルトンを使用するのがモノスタットよりも適しています。このオブジェクトは、データベース接続、Hibernateセッション、または同様のものをラップすることができます。

+0

+1。 "...非汎用のIEnumerableはこのように範囲にはありません。" – Fung

+0

IPersonStuffは、オブジェクトPersonの値を設定/取得します(DBを使用します)。 Personは基本的にgetter/setterクラスです。 Personクラスのアイテムを列挙したいと思います。 – user159603

+0

つまり、Personオブジェクトが保持するアイテムを列挙したいと思います。 – user159603

0

ジェフリーさんがSystem.Collections.Genericへの参照が不足していると言ったように、おそらくエラーが発生しているのは、非汎用のIEnumerableです。正しい参照を取得したら、(person as IEnumerable)のキャストは必要ありません。

タイプセーフであるかどうかは、状況によって異なります。あなたが列挙しているもののすべての要素が同じタイプ(つまり、固定クラス、インターフェイスまたはサブクラス)で、タイプセーフであるべきである場合/ IEnumerableを使用することができます。しかし、おそらく、あなたが試みているかもしれないように聞こえるPersonのすべてのプロパティを列挙し、diff型を返そうとしているとしたら、non-generic IEnumerableを使用する必要があります。

クラスのプロパティを列挙している場合は、Person.GetEnumerator()に(IEnumeratorを実装するカスタムクラスを記述するのではなく)各プロパティにyield returnを使用するのが良いトリックです。

+0

申し訳ありません、はい私は最初の質問を修正して、さまざまなタイプ(ジェネリックでないIEnumerable)を世話しました。私はInterfaceクラスIPersonStuffを通してそれを呼び出せますか? – user159603

関連する問題