Прочитайте app.config, используя LINQ - PullRequest
0 голосов
/ 14 декабря 2010

Я реализовал (используя System.Configuration пространство имен) и настроил следующую App.config структуру:

<bot>
    <strategies>
        <add name="TestStrategy" type="Bot.Strategy.Test" >
            <indicators>
                <add name="Foo" type="Bot.Indicators.Foo, Bot" />
                <add name="Bar" type="Bot.Indicators.Bar, Bot" />  
            </indicators>
            <orders>
                <add id="123" amount="0.1" />
            </orders>
        </add>
    </strategies>
</bot>

для следующих классов:

class TestStrategy : IStrategy
{
    public TestStrategy(IEnumerable<IIndicator> indicators, IEnumerable<Order> orders) { }
}

interface IIndicator { }

class Order
{
    public int ID { get; set; }
    public double Amount { get; set; }
}

Так, как я могу прочитать мой App.config, чтобы создать экземпляр IEnumerable<IStrategy>, вызывающий конструктор каждого с соответствующими IEnumerable<IIndicator> и IEnumerable<Order>, используя LINQ?

У меня уже есть следующее:

var section = ((BotSection)ConfigurationManager.GetSection("bot"));
return from strategy in section.Strategies
       let strategyType = Type.GetType(strategy.Type)
       where !strategyType.IsInterface && !strategyType.IsAbstract && typeof(IStrategy).IsAssignableFrom(strategyType)
       select (IStrategy)Activator.CreateInstance(strategyType, ?);

1 Ответ

1 голос
/ 14 декабря 2010

Если ваш BotSection определен правильно, вы можете сделать это (обратите внимание на подзапросы):

return
    from strategy in section.Strategies
    let strategyType = Type.GetType(strategy.Type)
    where !strategyType.IsInterface && !strategyType.IsAbstract
        && typeof(IStrategy).IsAssignableFrom(strategyType)
    let indicators = (
        from indicator in strategy.Indicators
        let indicatorType = Type.GetType(indicator.Type)
        select (IIndicator)Activator.CreateInstance(indicatorType))
    let orders = (
        from order in strategy.Orders
        let id = order.Id
        select new Order { Id = order.Id, Amount = order.Amount })
    select (IStrategy)Activator.CreateInstance(strategyType, indicators, orders);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...