2010-12-21 7 views
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; 
} 

작품.

답변

1

LINQ 표현 indicatorsGetEnumerator에 전화 할 때마다 재평가됩니다. ToList 또는 ToArray을 호출하여 단일 평가를 강제 실행해야합니다. 물론 많은 지표가 필요한 경우 메모리 공간 문제가 발생할 수 있습니다.

+0

두 개의 하위 쿼리에 대해'IIndicatorReader'를 재사용하고 ToArray()를 사용하지만 여전히 중복 된 인스턴스를 가져옵니다. 디버거에서 생각 나는 전략 인스턴스화하기 전에 2 지표의 배열을 참조하십시오. 비 제네릭 구현에서 일반적인'GetEnumerator()'변환으로 인해 발생할 수 있습니까? (내 게시물을 업데이트했습니다) – abatishchev

+0

@abatishchev - 나는 작은 세부 사항을 놓치고 있다는 느낌을 갖습니다. 이유 내에서 조금 더 많은 정보를 게시 할 수 있습니까? 또는 다음과 같이 게시 할 수 있습니다. https://gist.github.com/ – ChaosPandion

+0

무엇이 있습니까 : myapp는 app.config (지표 및 주문 수를 포함한 전략)에서 사용자 정의 섹션을 읽고, 모든 인스턴스를 생성하고, 연결합니다 외부 서버에 이벤트를 구독하면 이벤트가 발생할 때마다 모든 전략에 대해 알립니다 (일부 데이터 전송). 각 전략은 지표를 묻고 그 명령을 어떻게 처리할지 결정합니다. 또한 표시기는 읽은 데이터를 추적 소스에 기록합니다. 그리고 추적에서 일어나는대로 첫 번째 지표는 두 번 나타납니다. 다른 모든 지표는 한 번만 나타납니다. 나는 왜 그런지 상상할 수 없다. 필요한 코드를 게시 할 수 있습니다. 티아! – abatishchev