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