2013-07-06 65 views
1

我有C#對象的列表和每個對象有100個屬性:動態獲取對象列表的屬性?

public string Group1; 
public string Group2; 
public string Group3; 

..................... 
... 
.. 
. 
public string Group99; 
public string Group100; 

我希望能夠在兩個數字傳遞在1至100的範圍內,只有拿到這間落在性質範圍。

例如,如果我在數通31〜50我想屬性:

public string Group31; 
public string Group32; 

.................... 
... 
.. 
. 
public string Group50; 

我如何將能夠實現這一目標?

+0

只是爲了檢查這只是示例代碼和您的實際代碼更復雜?目前上面看起來你用字典而不是這個字典更好。此外,是否這樣的財產名稱是統一的可能會有所不同的答案... – Chris

+1

這些是領域。你*實際上*有領域,還是你有屬性?爲什麼你不只是有一個集合呢? –

+1

你需要一個「反射」來完成這項任務。但是,如上所述,數組或列表使用看起來更合適,如上所述。 – Tommi

回答

1

你的情況,你有字段,所以您可以使用反射和LINQ是這樣的:

//pass your class to typeof 
var ClssType = typeof (SomeCLass); 
ClssType.GetFields().OrderBy(n=>n.Name).Skip(30).Take(19).ToList(); 

在跳過你傳遞你想跳過befaure服用領域的數字。

如果你有屬性,你可以使用.GetProperties()代替.GetFields()

讓你的屬性,你需要調用.GetValue(obj, null)您的陣列中的每個對象的值。

//let say you have array of objects myObj[] then your code will look like this: 
    var fieldsInfos = ClssType.GetFields().OrderBy(n=>n.Name).Skip(30).Take(19).ToList(); 
    //go thorugh your array 
    foreach(var obj in myObj) 
    { 
     //go through fields 
     foreach(var field in fieldsInfos) 
     { 
      //get value of field by calling 
      Console.WriteLine(field.GetValue(obj, null)); 
     }  
    } 
+0

我必須對每個對象執行此操作,還是可以將其應用於列表中的所有對象? – Xerxes

+0

你確定GetFields會返回排序字段數組嗎?否則,直接跳過/拿走將毫無意義。 – Tommi

+0

@Tommi no,已添加OrderBy –