LINQ和Activator.CreateInstance()创建重复项

时间:2010-12-21 19:59:54

标签: c# linq app-config activator

我有下一个LINQ查询来读取App.config以使用内部声明的完全限定类型实例化对象:

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中声明的指示符实例化两次,所有其他 - 一次。怎么会这样??我很乐意提供所需的任何其他信息。


我的指标集:

public class IndicatorElementCollection : ConfigurationElementCollection, IEnumerable<IndicatorElement>
{
    ...

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

GetEnumerator()从非通用转换为通用的实现取自this question on SO

另一种实施方式:

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

以同样的方式工作。

1 个答案:

答案 0 :(得分:1)

每次调用indicators时,都会重新评估LINQ表达式GetEnumerator。您需要通过调用ToListToArray来强制进行单一评估。如果你期待很多指标,这当然会导致内存空间问题。