C# 如何将配置文件中的配置读取到强类型设置对象中

C# 如何将配置文件中的配置读取到强类型设置对象中,c#,app-config,.net-4.5,configuration-files,C#,App Config,.net 4.5,Configuration Files,上下文:我正在开发一个库(我们称之为InternalLib),供同事使用,但从他们的角度来看,它是一个外部程序集。在InternalLib中,我还需要使用一个外部库(我们称之为ExternalLib),我使用ILMerge将其合并到InternalLib中 InternalLib和ExternalLib都需要使用app.config中的配置。我知道我的同事可以在他们的app.config中为InternalLib和ExternalLib定义configSections和链接的applicatio

上下文:我正在开发一个库(我们称之为InternalLib),供同事使用,但从他们的角度来看,它是一个外部程序集。在InternalLib中,我还需要使用一个外部库(我们称之为ExternalLib),我使用ILMerge将其合并到InternalLib中

InternalLib和ExternalLib都需要使用app.config中的配置。我知道我的同事可以在他们的app.config中为InternalLib和ExternalLib定义
configSections
和链接的
applicationSettings
,但是有什么方法可以从不同的配置文件读取配置吗?(例如InternalLib.dll.config)我宁愿给他们一个dll和一个.config,也不愿让他们在配置文件中添加n个配置部分


我可以使用
ExeConfigurationFileMap
将InternalLib更改为将配置文件读入
configuration
对象,但我无法控制ExternalLib从何处获取配置。我的意思是,即使我将ExternalLib的配置放入一个
配置
对象,我也不能告诉ExternalLib使用该对象而不是
设置。默认值。[…]
,可以吗?

您可以通过以下方式更改项目使用的配置文件:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", AppDomain.CurrentDomain.BaseDirectory + confFolder + "app.config");
如有需要,随后重置

    private void ResetConfigMechanism()
    {
        typeof(ConfigurationManager)
            .GetField("s_initState", BindingFlags.NonPublic |
                                     BindingFlags.Static)
            .SetValue(null, 0);

        typeof(ConfigurationManager)
            .GetField("s_configSystem", BindingFlags.NonPublic |
                                        BindingFlags.Static)
            .SetValue(null, null);

        typeof(ConfigurationManager)
            .Assembly.GetTypes()
            .Where(x => x.FullName ==
                        "System.Configuration.ClientConfigPaths")
            .First()
            .GetField("s_current", BindingFlags.NonPublic |
                                   BindingFlags.Static)
            .SetValue(null, null);
    }

您可以使用XmlSerializer,例如(简化、无错误处理等):

公共类配置,其中T:class
{
公共静态T荷载()
{
使用(var reader=newstreamreader(“config.xml”))
{
return(T)(新的XmlSerializer(typeof(T)))。反序列化(reader);
}
}
}

除了一个小问题外,它真的很有趣,而且确实做了我想做的事情。如您所知,它会重置整个应用程序的配置。我将研究“保存旧配置并在以后重新加载”,但如果调用应用程序修改了一些设置,但尚未保存,恐怕会造成不希望的效果。我还没有找到一个干净的方法来临时保存挂起的配置更改、加载我的配置、使用它并恢复临时状态,但是由于应用程序更改设置并在此时不保存设置是非常不寻常的,所以我将在我的用户文档中添加一个关于这方面的注释,并以这种方式继续。谢谢Sam。在我看来,您正在尝试从XML文件读取配置。在这种情况下,请查看以下内容:
public class Config<T> where T : class
{
    public static T Load()
    {
        using (var reader = new StreamReader("config.xml"))
        {
            return (T)(new XmlSerializer(typeof(T))).Deserialize(reader);
        }
    }
}