2012-09-18 2 views
-1

저는 C#을 사용하여 응용 프로그램을 만들고 있고 가지고있는 120 개의 문자열을 통해 foreach() 루프를 쉽게 수행 할 수 있기를 원합니다. 이러한 모든 문자열은 다음과 같이 구성된다 :C에서 공용 문자열의 클래스에서 목록을 만들 수 있습니다 #

public class _currentweekapi 
    { 
     public string _1_artist { get; set; } 
     public string _2_artist { get; set; } 
     public string _3_artist { get; set; } 
     ... 
    } 

이 가능한 모든 값을 통해 루프 foreach는() 루프를 할 수있을 것입니다. 문자열은 JSON 피드에서 자동으로 설정되므로 값을 목록에 바로 입력 할 수 없습니다.

주제에 대해 읽었을 때 '리플렉션'을 통한 방법이 있지만 C#을 처음 접했고 그것에 대해 읽는 것이 의미가 없습니다.

누군가가 이것을 구현할 수있는 방법을 정확히 설명하는 해결책을 도울 수 있습니까?

+3

정말 이상한 클래스입니다. 목록 으로 변경할 수 있습니까? –

+2

문자열을 설정하는 방법을 보여줍니다. 나는 그들을 IEnumerable을 구현하는 무언가에 저장하는 방법이 있다고 확신한다. – Erix

+0

내 대답은 루프를 건너 뛰고 이름으로 속성에 직접 액세스하는 것입니다. 이것은 아마 당신이 묘사하고있는 문제에 대한 좋은 생각이 아니지만 제공된 정보로는 말할 수 없습니다. 반사는 일반적으로 성능 문제로 인해 좋은 생각이 아닙니다. foreach 루프에서 수행하는 작업과 같이 더 많은 정보를 제공 할 수 있다면 더 나은 답변을 얻을 수 있습니다. – Trisped

답변

1

먼저해야 할 일은 클래스 정의가 수행하는 것처럼 명시 적으로 명명 된 속성에 문자열을 저장하지 않는 것입니다. 가장 적절한 시나리오는 List < 문자열 > 인 것처럼 보이며 클래스에 모두 들어갈 수 있습니다. 이것은 이미 귀하의 목록을 갈 준비가되어 있음을 의미합니다.
그렇다면 클래스를 변경하거나 JSON 피드를 허용하는 다른 클래스를 사용하고 명시 적으로 120 개의 속성을 설정하는 대신 List < 문자열 > 유형의 속성에 .Add()를 사용하면됩니다. 이처럼

: 다음

public class ArtistData 
{ 
    public List<string> Artists{ get; set; } 

    public ArtistData() 
    { 
     this.Artists = new List<string>(0); 
    } 

    public void PopulateArtists(string jsonFeed) 
    { 
     // here something desrializes your JSON, allowing you to extract the artists... 
     // here you would be populating the Artists property by adding them to the list in a loop... 
    } 
} 

, 당신은 속성 연예인 목록을 가지고 있고, 직접 목록을 사용하거나 수행하여 그것을 반환 할 수 있습니다 그러나

string[] artists = myInstance.Artists.ToArray(); 

, 당신은에 보인다 그들이 결국 당신이 우리에게 보여준 수업에서 당신에게 개인의 재산으로 봉사 한 사실을 바꿀 수 없다는 것을 나타 냈습니다. ...

당신이 선택하지 않았지만 당신이 보여준 것과 같은 수업에서 시작한다고 가정하십시오. , 여기있다.

// this will return a list of the values contained in the properties... 
    public List<string> GetListFromProperties<T>(T instance) 
    { 
     Type t = typeof(T); 
     PropertyInfo[] props = t.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     // As a simple list... 
     List<string> artists = new List<string>(props.Length); 
     for (int i = 0; i < props.Length; i++) 
     { 
      if(!props[i].Name.Contains("_artist")){ continue; } 
      artists.Add(props[i].GetValue(instance, null).ToString()); 
     } 

     return artists; 
    } 

    // this will return a dictionary which has each artist stored 
    // under a key which is the name of the property the artist was in. 
    public Dictionary<string,string> GetDictionaryFromProperties<T>(T instance) 
    { 
     Type t = typeof(T); 
     PropertyInfo[] props = t.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     // As a dictionary... 
     Dictionary<string,string> artists = new Dictionary<string,string>(props.Length); 
     for (int i = 0; i < props.Length; i++) 
     { 
      if(artists.ContainsKey(props[i].Name) || !props[i].Name.Contains("_artist")){ continue; } 
      artists.Add(props[i].Name, props[i].GetValue(instance, null).ToString()); 
     } 

     return artists; 
    } 
: 당신이해야합니다 모든 것을, 요구대로 당신이 모든 값을 통해 루프를 할 수있는 방법은, 각이 필요로하는 하나 개의 매개 변수로 아래의 방법 중 하나에 클래스의 인스턴스를 전달한다는 것입니다

하나의 도움을 주어야하지만 사전을 사용하지 마십시오. 각 아티스트의 이름을 알 필요가 없다면 더 많은 오버 헤드가 필요하므로 간단한 목록보다 도움이됩니다.

덧붙여 말하자면,이 메서드는 generic 타입이므로 T 타입의 매개 변수를 받아들이므로 현재 고민하고있는 클래스 인스턴스가 아닌 동일한 메서드가 모든 클래스 인스턴스에서 작동합니다.

기억해 : 순간적으로 당신에게 매우 편리하게 보일지 모르지만, 이것이 반드시 이것에 접근하는 최선의 방법은 아닙니다.이것보다 더 나은 것은 클래스를 다시 작업하기 위해 내가했던 초기 제안 일 것이므로 이런 종류의 일은 필요하지 않습니다.

+0

꿈을 이루었습니다! 감사 –

0

당신은 같은 것을 수행 할 수 있습니다

 List<string> list = new List<string>(); 
     foreach (var property in _currentweekapi.GetType().GetProperties()) 
     { 
      list.Add(property.GetValue(_currentweekapi, null));    
     } 
2

이 반사를 아주 쉽게되어 사용 - 시작이 시도를

var properties = typeof(_currentweekapi).GetProperties(); 

foreach(PropertyInfo info in properties) { 
    if (info.Name.EndsWith("artist") { 
    // do something amazing 
    } 
} 

참조 - http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx 자세한 내용

0

당신이 확신 할 수있는 경우에 대한 다른 유형의 속성이 없다면 작동합니다 :

var list = 
    typeof(_currentweekapi) 
     .GetProperties() 
     .Select(pi => (string)pi.GetValue(x, null)) 
     .ToList(); 
관련 문제