2014-04-06 2 views
0

(나는이 작성하지 않은,하지만 난이 작동한다)으로 반복은

나는이 모든 인스턴스를 반복 할 필요가
class Person{ 

    public string Name { 
    get; 
    private set; 
    } 

    public static Person P1 = new Person("name1"); 
    public static Person A1 = new Person("aName1"); 
    public static Person ZX1 = new Person("NameZX"); 
    public static Person P2 = new Person("name2"); 
    . 
    . 
    public static Person P20 = new Person("name20");  
} 

, 난 생각이 반영하지만 난을 포함한다 정확히 어떻게해야할지 모르겠다. Selman22 @

, 덕분에, 지금은이 사람을 통해 루프

forach(var p in persons) 
{ 
} 

그러나 pFieldInfo 객체, 내가 어떻게 (캐스팅이 작동하지 않습니다)는 Person로 다시 변경합니까

답변

3

입니다한다

var persons = typeof(Person) 
      .GetFields(BindingFlags.Public | BindingFlags.Static) 
      .Where(x => x.Name.StartsWith("P")); 

또는를 : 당신은 당신의 필드 같은 Reflection를 사용하여 얻을 수

var persons = typeof(Person) 
       .GetFields(BindingFlags.Public | BindingFlags.Static) 
       .Where(x => x.GetValue(null) is Person); 

foreach(var p in persons) 
{ 
    var currentPerson = p.GetValue(null) as Person; 
    ... 
} 
+0

이봐, 속성의 인스턴스를 구별 할 수있는 방법이있다가, 죄송들이 모두 'P'로 시작하지 않는 , 아픈 편집 내 질문. – heyNow

+0

@heyNow 다음 두 번째 솔루션을 시도하십시오 .btw, 당신은 속성과 필드를 차별화해야합니다. –

+0

안녕하세요, 내 질문 편집, 지금 이것을 통해 루프해야합니다. – heyNow

1

당신은 단지 배열에 모두 넣고 그것을 할 수 :

var people = new[] 
{ 
    Person1, 
    Person2, 
    ... 
    Person20 
}; 

foreach (var person in people) 
{ 
    ... 
} 
+0

왜 downvotes? 이것은 일반적으로 그것을하는 더 나은 방법입니다. –

+0

@ JohnSaunders 나는 downvote하지 않았다.. 그러나 나는이 대답이 질문에 대답하지 않는다는 사실에서 온 것 같아요. 문제는 제공된 코드로 작업해야한다는 말로 시작됩니다. 나에게 이것은 그가 코드를 변경할 수 없다는 것을 의미한다. – MAV

+0

@MAV : 그렇다면 나는 그 질문을 잘못 읽었다 고 말할 것입니다. 왜냐하면 그것은 그 계급의 구성원들을 반복해서 말한 것이기 때문입니다. 이 대답에 대해 말할 수있는 최악의 상황은 'Person1','Person2'가 아니라 'P1','P2'가되어야한다는 것입니다. –