2010-03-05 2 views
1

모든 개체에 대해 속성 이름과 값의 SortedList을 만들려고합니다. 아래의 두 메서드는 정렬 된 목록에 해당 값을 저장하는 객체의 속성을 반복합니다 (이를 수행하는 더 좋은 메커니즘이있는 경우 권장합니다).C에서 인덱스 속성의 값을 동적으로 검색합니다.

내 현재 구현에서는 색인 속성에 관한 문제가 있습니다. Object.GetType Method은 인덱스 속성 배열을 지정하는 메커니즘을 제공하지만이 속성을 사용하여 속성의 모든 값을 가져 오는 방법을 잘 모르겠습니다. 당분간 모든 값을 구분 된 단일 문자열로 연결하고 싶습니다.

private static SortedList<string, string> IterateObjProperties(object obj) 
{ 
    IDictionaryEnumerator propEnumerator = ObjPropertyEnumerator(obj); 
    SortedList<string, string> properties = new SortedList<string, string>(); 

    while (propEnumerator.MoveNext()) 
    { 
     properties.Add(propEnumerator.Key.ToString(), 
      propEnumerator.Value is String 
      ? propEnumerator.Value.ToString() : String.Empty); 
    } 

    return properties; 
} 

private static IDictionaryEnumerator ObjPropertyEnumerator(object obj) 
{ 
    Hashtable propertiesOfObj = new Hashtable(); 
    Type t = obj.GetType(); 
    PropertyInfo[] pis = t.GetProperties(); 

    foreach (PropertyInfo pi in pis) 
    { 
     if (pi.GetIndexParameters().Length == 0) 
     { 
      propertiesOfObj.Add(pi.Name, 
       pi.GetValue(obj, Type.EmptyTypes).ToString()); 
     } 
     else 
     { 
      // do something cool to store an index property 
      // into a delimited string 
     } 
    } 

    return propertiesOfObj.GetEnumerator(); 
} 
+0

인덱서의 동작이 구현 자에 의해 완전히 정의 된 경우이를 수행하는 일반적인 방법이 있는지 확실하지 않습니다. 클래스를 serialize하는 코드를 생성하는 툴을 작성했을 때 비슷한 문제가 발생했습니다. 나는 형식이 IEnumerable 또는 ICollection을 구현하는지 여부를 확인하여 컬렉션을 처리했습니다. 또한 Count 또는 Length 속성이 있는지 확인했습니다. 이 기준에 맞지 않는 유형의 경우 BinaryFormatter를 사용하여 직렬화하는 방법을 알아 냈습니다. – MikeB

답변

2

일반적으로 이것은 수행 할 수 없습니다. 인덱서는 인수를 속성이며, (적절한 유형의) 모든 인수를 취할 수 있습니다 : 일부 클래스가 작동하는 방법을 제공 할 수

public class DumbExample 
{ 
    // What constitutes "all the values of" the DumbExample indexer? 
    public string this[string s] { get { return s; } } 
} 

: 값의 유한 집합이있을 것이라는 보장이 없다 인덱서 (또는 인덱서 게터)에 유효한 입력을 내보내십시오. Dictionary<TKey,TValue>.Keys (물론 여기에서는 인덱서 세트가 TKey를 사용할 수 있지만 Keys는 getter에 유효한 입력을 가져옵니다.이 경우에는 List<T>.Count 등) 특유한. 그래서 여러분의 코드는 그것들을 특별한 경우로서 다루어야 할 것입니다.

+0

+1, 당신이 클래스 구조를 제어한다면 단지'IEnumerable'을 구현해야합니다. 그렇지 않으면 당신은 SOL입니다. – Aaronaught

1

클래스 인스턴스의 인덱스 속성에 대해 가능한 모든 색인을 알 수있는 방법이 없습니다. 인덱서는 매개 변수를 취하는 메서드이므로 매개 변수를 사용하는 다른 메서드와 마찬가지로 매개 변수 값의 가능한 모든 조합을 열거 할 방법이 없습니다.

0

와우 이것은 끔찍합니다. 모든 인덱스 집합을 찾아서 각 인덱스에서 각 값을 재귀 적으로 트래버스하는 방법이 있기를 바랬습니다.

인덱스에 설정된 값을 검토 할 방법이 없다고 생각합니다.

+0

왜 투표를해야하는지 확신 할 수 없습니다. 목표를 성취 할 수있는 능력이 부족하다는 것에 실망감을 표하는 것이 왜 부정적인 것을 보장하는지에 대한 몇 가지 이유가 있습니까? – Ristogod

관련 문제