【问题标题】:LINQ and Activator.CreateInstance() creates duplicatesLINQ 和 Activator.CreateInstance() 创建重复项
【发布时间】:2010-12-24 23:23:42
【问题描述】:

我有下一个 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;
}

以同样的方式工作。

【问题讨论】:

    标签: c# linq app-config activator


    【解决方案1】:

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

    【讨论】:

    • 我对@9​​87654326@ 进行了修改,并对两个子查询都使用了ToArray(),但仍然会得到重复的实例。在调试器中思考,我在策略实例化之前看到了一组 2 个指标。可能是由于我实现非泛型到泛型GetEnumerator() 转换造成的吗? (我更新了我的帖子)
    • @abatishchev - 我感觉我遗漏了一些小细节。你能在合理的范围内发布更多信息吗?或者可能发布到这样的内容:gist.github.com
    • 我有什么:myapp 从 app.config 读取自定义部分(具有指标和订单数量的策略),实例化所有这些,连接到外部服务器,订阅其事件和每个事件触发的时间会通知所有策略(发送一些数据)。每个策略都会查询其指标并决定如何处理其订单。此外,指标将它们读取的数据写入跟踪源。正如它在跟踪中发生的那样,第一个指标出现两次,所有其他的 - 只是一次。我无法想象为什么。我可以发布您需要的任何代码。 TIA!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多