我正在嘗試爲任何對象創建屬性名稱和值的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();
}
我不確定是否有任何通用的方法來執行此操作,因爲索引器的行爲完全由實現者定義。當我編寫一個工具生成代碼來序列化類時,我遇到了類似的問題。我通過檢查類型是否實現IEnumerable或ICollection來處理集合。我還檢查了他們是否有Count或Length屬性。對於任何不符合這個標準的類型,我只是回到BinaryFormatter找出如何序列化它。 – MikeB 2010-03-05 23:40:49