4
나는 내 주장 정규화 된 형식을 사용하여 개체를 인스턴스화의 App.config를 읽을 수있는 다음 LINQ 쿼리가 있습니다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에 명시된 지표는 두 번 을 인스턴스화, 다른 모든 - 번. 어떻게 그럴 수 있니? 추가 정보를 제공해 드리겠습니다.는 내 지표 수집 : 일반에 제네릭이 아닌에서
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;
}
작품.
두 개의 하위 쿼리에 대해'IIndicatorReader'를 재사용하고 ToArray()를 사용하지만 여전히 중복 된 인스턴스를 가져옵니다. 디버거에서 생각 나는 전략 인스턴스화하기 전에 2 지표의 배열을 참조하십시오. 비 제네릭 구현에서 일반적인'GetEnumerator()'변환으로 인해 발생할 수 있습니까? (내 게시물을 업데이트했습니다) – abatishchev
@abatishchev - 나는 작은 세부 사항을 놓치고 있다는 느낌을 갖습니다. 이유 내에서 조금 더 많은 정보를 게시 할 수 있습니까? 또는 다음과 같이 게시 할 수 있습니다. https://gist.github.com/ – ChaosPandion
무엇이 있습니까 : myapp는 app.config (지표 및 주문 수를 포함한 전략)에서 사용자 정의 섹션을 읽고, 모든 인스턴스를 생성하고, 연결합니다 외부 서버에 이벤트를 구독하면 이벤트가 발생할 때마다 모든 전략에 대해 알립니다 (일부 데이터 전송). 각 전략은 지표를 묻고 그 명령을 어떻게 처리할지 결정합니다. 또한 표시기는 읽은 데이터를 추적 소스에 기록합니다. 그리고 추적에서 일어나는대로 첫 번째 지표는 두 번 나타납니다. 다른 모든 지표는 한 번만 나타납니다. 나는 왜 그런지 상상할 수 없다. 필요한 코드를 게시 할 수 있습니다. 티아! – abatishchev