4

次の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に最初に記載されているインジケーターは、2回インスタンス化され、他のすべては1インスタンス化されます。どうして?必要な追加情報があれば喜んで提供します。


私のインジケーターコレクション:

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

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

GetEnumerator()非ジェネリックからジェネリックへの変換の実装は、SOに関するこの質問から取得されます。

別の実装:

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

同じように動作します。

4

1 に答える 1

1

LINQ式indicatorsは、を呼び出すたびに再評価されますGetEnumeratorToListまたはを呼び出して、単一の評価を強制する必要がありますToArray。もちろん、多くの指標を期待している場合、これによりメモリスペースの問題が発生する可能性があります。

于 2010-12-21T20:07:02.780 に答える