c# – LINQ和Activator.CreateInstance()创建重复项
发布时间:2020-12-15 21:13:36 所属栏目:百科 来源:网络整理
导读:我有下一个LINQ查询来读取App.config以使用内部声明的完全限定类型实例化对象: var strategies = from strategy in section.Strategieslet indicators = ( from indicator in strategy.Indicators select (IIndicatorReader)Activator.CreateInstance(Type.
我有下一个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),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; } 以同样的方式工作. 解决方法
每次调用GetEnumerator时,都会重新评估LINQ表达式指示符.您需要通过调用ToList或ToArray强制执行单个评估.如果你期待很多指标,这当然会导致内存空间问题.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |