使用 LINQ 读取 app.config

发布于 2024-10-07 17:04:33 字数 1472 浏览 0 评论 0原文

我已经实现了(使用 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 使用 LINQ 使用适当的 IEnumerableIEnumerable 调用每个的构造函数?

我已经有了下一个:

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, ?);

I have implemented (using System.Configuration namespace) and configured next App.config structure:

<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>

for next classes:

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; }
}

So how can I read my App.config to instantiate IEnumerable<IStrategy> calling the constructor of each with appropriate IEnumerable<IIndicator> and IEnumerable<Order> using LINQ?

I have already next:

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, ?);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

时光磨忆 2024-10-14 17:04:33

如果您的 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);

If your BotSection is defined correctly, you can do this (note the sub queries):

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文