2015-05-15 95 views
3

我有以下內容存儲在ArrayList中作爲純字符串每行代表列表中的項目的值,有沒有辦法生成以下風格的動態對象: [左操作數是屬性] = [右操作數是該屬性的值]我希望有具有以下結構的對象在運行時從C#中的ArrayList生成自定義對象

object.data.details[1].tid=711 
object.data.details[1].type="ongoing" 
object.data.details[1].attach="node1" 
object.data.details[1].flowing[1].comid="component1" 
object.data.details[1].flowing[1].system-usage.RAM="12%" 
object.data.details[1].flowing[1].system-usage.CPU="3%" 
object.data.details[1].flowing[1].system-usage.Pages=3 
object.data.details[1].flowing[2].comid="component2" 
object.data.details[1].flowing[2].system-usage.RAM="9%" 
object.data.details[1].flowing[2].system-usage.CPU="2%" 
object.data.details[1].flowing[2].system-usage.Pages=1 
object.data.details[1].flowing[3].comid="component3" 
object.data.details[1].flowing[3].system-usage.RAM="7%" 
object.data.details[1].flowing[3].system-usage.CPU="7%" 
object.data.details[1].flowing[3].system-usage.Pages=5 
object.data.details[2].tid=712 
object.data.details[2].type="ongoing" 
object.data.details[2].attach="node2" 
object.data.details[2].flowing[1].comid="component1" 
object.data.details[2].flowing[1].system-usage.RAM="12%" 
object.data.details[2].flowing[1].system-usage.CPU="3%" 
object.data.details[2].flowing[1].system-usage.Pages=3 
object.data.details[2].flowing[2].comid="component2" 
object.data.details[2].flowing[2].system-usage.RAM="9%" 
object.data.details[2].flowing[2].system-usage.CPU="2%" 
object.data.details[2].flowing[2].system-usage.Pages=1 
object.data.details[2].flowing[3].comid="component3" 
object.data.details[2].flowing[3].system-usage.RAM="7%" 
object.data.details[2].flowing[3].system-usage.CPU="7%" 
object.data.details[2].flowing[3].system-usage.Pages=5 
object.data.details[3].tid=713 
object.data.details[3].type="ongoing" 
object.data.details[3].attach="node2" 
object.data.details[3].flowing[1].comid="component1" 
object.data.details[3].flowing[1].system-usage.RAM="12%" 
object.data.details[3].flowing[1].system-usage.CPU="3%" 
object.data.details[3].flowing[1].system-usage.Pages=3 
object.data.details[3].flowing[2].comid="component2" 
object.data.details[3].flowing[2].system-usage.RAM="9%" 
object.data.details[3].flowing[2].system-usage.CPU="2%" 
object.data.details[3].flowing[2].system-usage.Pages=1 
object.data.details[3].flowing[3].comid="component3" 
object.data.details[3].flowing[3].system-usage.RAM="7%" 
object.data.details[3].flowing[3].system-usage.CPU="7%" 
object.data.details[3].flowing[3].system-usage.Pages=5 

object.data.details[i].flowing[j].comid="component1" 
if i=j=1 
object.data.details[i].flowing[j].system-usage.RAM="9%" 
if i=1 and j=2 
換句話說

我需要生成一個動態的對象CT,可以有一個ArrayList的屬性列表就像當我們可以通過訪問在asp.net GridView中顯示的任何值:

gridview1.rows[i].someproperty[j].value = "something" 

我試圖用ExpandoObject但未能我也試圖與反思,但它消耗了很多如果我在同一個線程中生成〜1K個對象的話,它的內存就會變大

+0

是,「有一種方法來產生下面的樣式動態對象」,但它有點太寬泛...附註:使用JSON會讓你的生活更輕鬆... –

+0

有趣的是,這個列表實際上是從JSON對象生成的,但是使用我自己構建的自定義處理器,這樣我就可以以問題發佈的方式獲得結果。 @AlexeiLevenkov – Hassan8541

+0

請注意,結構不固定,否則我可以建立一個類來將這些字符串值序列化爲:( – Hassan8541

回答

0

玉傢伙我想出如何做到這一點,以防萬一有人誰還會在這裏面對這個問題是解決方案:

  1. 你必須使用點和指針保持來標記每行(。)跟蹤指數的,你應該使用指針與ref關鍵字,以躍過SQUARED_OPEN和SQUARED_CLOSED字符,以及該指數

    之間
  2. ,您將需要具備以下對象

     
    ExpandoObject expandoObject = new ExpandoObject(); 
    IDictionary objects = expandoObject; 
    
  3. 您需要構建一個遞歸方法,該方法能夠將第一級標記化字符串(第一個標記)添加爲字典鍵,並且其值爲expando對象。

  4. 在每一行添加剩餘的字符串作爲值給expando

  5. 記號化已經被存儲作爲對象的expando剩餘字符串然後重複3,4

並且那所有。你將有一個的expando對象,將允許您通過鏈接的屬性,例如訪問任意值:

<pre> 
var x = data.details[1].flowing[2].system_usage.Pages; 
</pre>