2011-07-06 78 views
1

當我循環進入List時,我總是看到列表中所有項目的值相同。List <dynamic>().Add problem C#

我哪裏錯了?

這是我做的。

var DyObjectsList = new List<dynamic>; 
dynamic DyObj = new ExpandoObject(); 
if (condition1) 
{ DyObj.Required = true; 
    DyObj.Message = "Message 1"; 
    DyObjectsList.Add(DyObj); } 
if (condition2) 
{ DyObj.Required = false; 
    DyObj.Message = "Message 2"; 
    DyObjectsList.Add(DyObj); 
} 

......

有趣的是在DyObjectsList所有項目將在最後一次分配的對象的值替換。

+3

您將多個引用添加到同一個對象。 – asawyer

+2

...並且您正在分配同一個對象的屬性,看起來您可能期望存在不同的實例。 –

+0

我們不能只用這裏提供的一段代碼來幫助你。只考慮這個代碼,只有一個對象的引用被添加到列表中。請告訴我們這段代碼的上下文。它是在一個循環?它是一個函數的一部分嗎? –

回答

9

您需要實例化一個新實例if語句的體內(否則你反覆修改/添加引用相同的實例):

if (condition1) { 
    dynamic DyObj = new ExpandoObject(); 
    DyObj.Required = true; 
    DyObj.Message = "Message 1"; 
    DyObjectsList.Add(DyObj); } 
if (condition2) { 
    dynamic DyObj = new ExpandoObject(); 
    DyObj.Required = false; 
    DyObj.Message = "Message 2"; 
    DyObjectsList.Add(DyObj); 
} 

當然,更妙的是:

if(condition1) { 
    dynamic obj = GetNewDynamicObject(false, "Message 1"); 
    DyObjectsList.Add(obj); 
} 
if(condition2) { 
    dynamic obj = GetNewDynamicObject(true, "Message 2"); 
    DyObjectsList.Add(obj); 
} 

其中GetNewDynamicObject的定義很明顯。

+0

我已經玩過動態遊戲已經有一段時間了,不應該是動態的obj = GetNewDynamicObject(false,「消息1」);「雖然? – asawyer

4

您正在添加同一對象兩次,並在中間更改其屬性。

您需要每次添加new ExpandoObject()

0

當兩個條件都成立時,變量將被設置爲最後一個if塊。你可能應該使用else,而不是第二個block。