2017-10-26 9 views
0

저는 학습을 목적으로 작은 게임을 작성하고 있으며 foreach로 클래스 iterable을 만드는 데 문제가 있습니다. 많은 게임 객체가 구현하는 클래스이며 <dynamic> 유형의 문자열 인덱스 데이터 저장소를 제공합니다. 배열 스타일 액세스가 있으므로 object["arbitrary-key"] = foo;으로 갈 수 있지만 foreach(dynamic value in object)이되고 싶습니다. 그래서 IEnumerable 구현해야 할 것처럼 보이지만이 인터페이스에 대한 <dynamic> 형식 제한이있는 것 같습니다. IEnumerable <dynamic>을 구현할 수 없습니다. should not는해야 할 일을합니다.

public class GameObject : IEnumerable<dynamic> 
{ 
    public Dictionary<string, dynamic> data = new Dictionary<string, dynamic>(); 

    public GameObject() 
    { 

    } 

    //Overloads the [] operator to allow array style access 
    public dynamic this[string key] 
    { 
     get { return this.data[key]; } 
     set { data[key] = value; } 
    } 

    //Overloads foreach iteration 
    public IEnumerator<dynamic> GetEnumerator() 
    { 
     foreach (dynamic d in data) 
     { 
      yield return d; 
     } 
    } 

    IEnumerator<dynamic> IEnumerable<dynamic>.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

그래서 내가 잘못 짚었이 클래스를 재평가해야 할 수 있습니다 생각하고 있어요 :

Error CS1966 'GameObject': cannot implement a dynamic interface 'IEnumerable<dynamic>'

여기 클래스입니다. 어쩌면이 동작을 내장 한 게임 개체를 구현할 수있는 것이 있을까요? 또는 내 목표를 달성하기위한 다른 방법?

+2

[실제로 foreach와 작동하도록 클래스에 IEnumerable을 구현할 필요가 없습니다.] (https://stackoverflow.com/questions/127233/does-class-need-to-implement-ienumerable-to -use-foreach) –

+0

고마워요! 그것은 트릭을했다. – aurath

답변

0

Scott Chamberlain 올바른 방향으로 나를 가리켰습니다. 코드가 훨씬 나아졌습니다. 여기에 새로운 수업이 있습니다.

public class GameObject 
{ 
    public Dictionary<string, dynamic> data = new Dictionary<string, dynamic>(); 

    public GameObject() 
    { 

    } 

    //Overloads the [] operator to allow array style access 
    public dynamic this[string key] 
    { 
     get { return this.data[key]; } 
     set { data[key] = value; } 
    } 

    public Dictionary<string, dynamic>.Enumerator GetEnumerator() 
    { 
     return data.GetEnumerator(); 
    } 
} 

내가해야 할 일을했을 모든

은 함께 내 Dictionary의 열거를 통과 GetEnumerator() 기능을 구현했다.