2010-03-05 68 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

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

回答

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等等,但是這將是class-具體。所以你的代碼將需要處理每個這些特殊情況。

+0

+1,如果你控制類結構,那麼只需實現'IEnumerable',否則你就是SOL。 – Aaronaught 2010-03-05 23:38:08

1

沒有辦法知道類實例的索引屬性的所有可能的索引。索引器是一種接受參數的方法,與任何其他採用參數的方法一樣,無法枚舉所有可能的參數值組合。

0

哇這太可怕了。我希望有一種方法可以找到每個索引集,並遞歸遍歷每個索引的每個值。

我不相信有沒有辦法通過索引設置的值。

+0

我不確定你爲什麼覺得需要投票。爲什麼對缺乏實現目標的能力表達我的失望有理由保證消極? – Ristogod 2010-09-03 20:21:05