Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# app.config中的自由格式XML配置节正文_C#_.net_Configuration - Fatal编程技术网

C# app.config中的自由格式XML配置节正文

C# app.config中的自由格式XML配置节正文,c#,.net,configuration,C#,.net,Configuration,有没有一种方法可以创建一个允许自由格式XML正文的配置部分?我如何在代码中获得自由形式的主体 例如,我想创建一个模块配置部分,如下所示: <modules> <module name="ModuleA" type="My.Namespace.ModuleA, My.Assembly"> <moduleConfig> <serviceAddress>http://myserver/myservice.s

有没有一种方法可以创建一个允许自由格式XML正文的配置部分?我如何在代码中获得自由形式的主体

例如,我想创建一个模块配置部分,如下所示:

<modules>
    <module name="ModuleA" type="My.Namespace.ModuleA, My.Assembly">
        <moduleConfig>
            <serviceAddress>http://myserver/myservice.svc</serviceAddress>
        </moduleConfig>
    </module>
    <module name="ModuleB" type="My.Namespace.ModuleB, My.OtherAssembly">
        <moduleConfig>
            <filePath>c:\directory</filePath>
        </moduleConfig>
    </module>
</modules>

http://myserver/myservice.svc
c:\目录
因此,一些代码将使用
ConfigurationManager.GetSection(“modules”)
从配置节中旋转这些模块类型,我希望将
moduleConfig
元素中的XML作为不透明的配置值传递给模块类的构造函数


欢迎任何意见

我就是这样完成这项工作的:

public class ModuleElement : ConfigurationElement
{
    [ConfigurationProperty("name", IsRequired = true)]
    public string Name
    {
        get { return (string)base["name"]; }
        set { base["name"] = value; }
    }

    XElement _config;
    public XElement Config
    {
        get { return _config;  }
    }

    protected override bool OnDeserializeUnrecognizedElement(string elementName, System.Xml.XmlReader reader)
    {
        if (elementName == "config")
        {
            _config = (XElement)XElement.ReadFrom(reader);
            return true;
        }
        else
            return base.OnDeserializeUnrecognizedElement(elementName, reader);
    }
}
因此,xml看起来像:

<module name="ModuleA">
    <config>
        <filePath>C:\files\file.foo</filePath>
    </config>
</module>

C:\files\file.foo

config元素的主体可以是任何您喜欢的自由格式xml。假设您设置了一个集合,当您执行
ConfigurationManager.GetSection(“模块”)
时,您可以访问每个
ModuleElement
对象的
Config
属性,作为表示配置元素节点XML的XElement。

在我的应用程序中,我无法使用.NET 3.5框架。我使用了一种稍微不同的方法,并提出了以下代码:

public class ModuleSection : ConfigurationSection
{
    private const string ELEMENT_NAME_CONFIG = "config";

    private XmlNode _configNode;

    [ConfigurationProperty("name", IsRequired = true)]
    public string Name
    {
        get { return (string)base["name"]; }
        set { base["name"] = value; }
    }

    public XmlNode Config
    {
        get { return _configNode; }
    }

    protected override bool OnDeserializeUnrecognizedElement(string elementName, XmlReader reader)
    {
        if(elementName.Equals(ELEMENT_NAME_CONFIG, StringComparison.Ordinal)) {
            // Add the unrecognized element.
            _configNode = _xmlDocument.ReadNode(reader);
            return true;
        } else {
            return base.OnDeserializeUnrecognizedElement(elementName, reader);
        }
    }
}

您应该能够像在我的答案中保存
XElement
一样,为您想要的元素保留
XmlNode
。我更新了你的代码来显示这一点。