2010-12-21 112 views
4

我旁邊LINQ查詢讀取的App.config實例使用完全合格的對象類型裏面說:LINQ和Activator.CreateInstance()創建副本

var strategies = from strategy in section.Strategies 
let indicators = (
    from indicator in strategy.Indicators 
    select (IIndicatorReader)Activator.CreateInstance(Type.GetType(indicator.Type), bot.Mt, section.Symbol)) 
let orders = (
    from order in strategy.Orders 
    select new OrderInfo(order.Id, order.Operation.Value, order.Amount)) 
select (IStrategy)Activator.CreateInstance(Type.GetType(strategy.Type), section.Symbol, strategy.Amount, strategy.Limit, indicators, orders); 

所以策略裏面,每次我打電話

indicatorList.Select(i => i.Operation) 

這個實例發生:

(IIndicatorReader)Activator.CreateInstance(Type.GetType(indicator.Type), bot.Mt, section.Symbol)) 

和適當類的構造函數叫做。

但是,App.config中首先聲明的指示器實例化爲兩次,所有其他 - 一次。怎麼會這樣??我會很樂意提供任何所需的附加信息。


我的指示器集合:從非通用

實施 GetEnumerator()
public class IndicatorElementCollection : ConfigurationElementCollection, IEnumerable<IndicatorElement> 
{ 
    ... 

    public new IEnumerator<IndicatorElement> GetEnumerator() 
    { 
     return this.OfType<IndicatorElement>().GetEnumerator(); 
    } 
} 

轉換到通用從this question on SO拍攝。

另一種實現:

foreach (OrderElement element in (System.Collections.IEnumerable)this) 
{ 
    yield return element; 
} 

作品以同樣的方式。

回答

1

每當您撥打GetEnumerator時,都會重新評估LINQ表達式indicators。您需要通過調用ToListToArray來強制進行一次評估。如果您期待很多指標,這當然會導致內存空間問題。

+0

我重寫`IIndicatorReader`並使用`ToArray()`爲這兩個子查詢,但仍然得到重複的實例。在調試器中思考我在策略實例化之前看到一個2個指標的數組。可能是由於我實現了非泛型的`GetEnumerator()`轉換? (我更新了我的帖子) – abatishchev 2010-12-21 20:57:07