次の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;
}
同じように動作します。