2016-05-23 297 views
0

我知道这个主题已被覆盖在一些不同的Stackoverflow文章中,并且我已经阅读了大约30篇文章,以确保我所做的与那些。它是(甚至回答.Net 2.0,3.0和4.0版本的答案)C#.Net 4.0 - 具有属性和部分的自定义配置文件

我试图创建一个非常简单的(至少在我的脑海里)配置文件的部分上的自定义属性,然后可选部分内的项目。所以,现在的代码:

<?xml version="1.0" encoding="utf-8" ?> 
<CustomSiteConfiguration> 
    <Sites> 
     <Site siteRoot="/Site US" name="SiteUS_en"> 
     </Site> 
     <Site siteRoot="/Site Canada" name="SiteCanada_en"> 
     </Site> 
     <Site siteRoot="/Partner" name="Partner_en"> 
      <siteSettings> 
       <setting name="" value="" /> 
      </siteSettings> 
      <JavaScriptBundles> 
       <file name="" /> 
      </JavaScriptBundles> 
      <CSSBundles> 
       <file name="" /> 
      </CSSBundles> 
     </Site> 
    </Sites> 
</CustomSiteConfiguration> 

所以,你所看到的是类型网站的全局部分包含型网站的多个部分(CollectionElementCollections)。站点由项目上的自定义属性以及该部分内的可选项目定义。所以,siteSettings是可选的,JavaScriptBundles是可选的,CSSBundles也是可选的。

的C#代码如下:

对于网站

public class CustomGlobalSiteConfiguration : ConfigurationSection 
{ 
    public CustomGlobalSiteConfiguration() { } 

    [ConfigurationProperty("Sites")] 
    [ConfigurationCollection(typeof(SitesCollection), AddItemName="Site")] 
    public SitesCollection Sites 
    { 
     get 
     { 
      return (SitesCollection)base["Sites"]; 
     } 
    } 
} 

网站集

[ConfigurationCollection(typeof(SitesCollection), AddItemName="Site")] 
public class SitesCollection : ConfigurationElementCollection 
{ 
    // Constructor 
    public SitesCollection() { } 

    /* 
    public CustomSiteConfiguration this[int index] 
    { 
     get { return (CustomSiteConfiguration)BaseGet(index); } 
     set 
     { 
      if (BaseGet(index) != null) 
      { 
       BaseRemoveAt(index); 
      } 
       BaseAdd(index, value); 
     } 
    } // end of public siteSetting this [int index] 
    * */ 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((CustomSiteConfiguration)element).name; 
    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new SitesCollection(); 
    } 
} 

对于站点定义

/** 
* Overarching structure of the Site Item 
**/ 
public class CustomSiteConfiguration : ConfigurationElement 
{ 
    [ConfigurationProperty("siteRoot")] 
    public String siteRoot 
    { 
     get 
     { 
      return (String)this["siteRoot"]; 
     } 
     set 
     { 
      this["siteRoot"] = value; 
     } 
    } 

    [ConfigurationProperty("name")] 
    public String name 
    { 
     get 
     { 
      return (String)this["name"]; 
     } 
     set 
     { 
      this["name"] = value; 
     } 
    } 

    [ConfigurationProperty("siteSettings", IsRequired=false)] 
    public CustomSiteSiteSettings siteSettings 
    { 
     get 
     { 
      return this["siteSettings"] as CustomSiteSiteSettings; 
     } 
    } 

    [ConfigurationProperty("JavaScriptBundles", IsRequired = false)] 
    public JavaScriptBundles javaSciptBundle 
    { 
     get 
     { 
      return this["JavaScriptBundles"] as JavaScriptBundles; 
     } 
    } 


    [ConfigurationProperty("CSSBundles", IsRequired = false)] 
    public CSSBundles cssBundle 
    { 
     get 
     { 
      return this["CSSBundles"] as CSSBundles; 
     } 
    } 


}  // end of public class CustomSiteConfiguration : ConfigurationSection 

对于站点设置定义

/** 
* Subsection - Site Settings 
**/ 
public class CustomSiteSiteSettings : ConfigurationElementCollection 
{ 
    // Constructor 
    public CustomSiteSiteSettings() { } 

    public siteSetting this [int index] 
    { 
     get { return (siteSetting)BaseGet(index); } 
     set 
     { 
      if (BaseGet(index) != null) 
      { 
       BaseRemoveAt(index); 
      } 
       BaseAdd(index, value); 
     } 
    } // end of public siteSetting this [int index] 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((siteSetting)element).name; 
    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new CustomSiteSiteSettings(); 
    } 

}  // end of public class CustomSiteSiteSettings : ConfigurationSection 

站点设置元素

public class siteSetting : ConfigurationElement 
{ 
    [ConfigurationProperty("name")] 
    public String name 
    { 
     get 
     { 
      return (String)this["name"]; 
     } 
     set 
     { 
      this["name"] = value; 
     } 
    } // end of public String name 

    [ConfigurationProperty("value")] 
    public String value 
    { 
     get 
     { 
      return (String)this["value"]; 
     } 
     set 
     { 
      this["value"] = value; 
     } 
    } // end of public String value 
}  // end of public class siteSetting : ConfigurationElement 

我离开了其他项目的空间,但其他部分看起来是一样的。基本上,发生的事情是,我得到

无法识别的属性'siteRoot'。请注意,属性名称区分大小写。

看着一切,看起来我应该没问题,但是,我想我可能会做太多而缺少的东西。任何帮助,这将不胜感激。

谢谢

回答

0

我弄清楚我的代码出了什么问题。我将提供以下信息。我使用下面的文章来帮助追踪一些部分:How to implement a ConfigurationSection with a ConfigurationElementCollection

我把整个代码库全部从头开始构建起来。该XML仍然是相同的

<?xml version="1.0" encoding="utf-8" ?> 
<CustomSiteConfiguration> 
<Sites> 
     <Site siteRoot="/Site US" name="SiteUS_en"> 
     </Site> 
     <Site siteRoot="/Site Canada" name="SiteCanada_en"> 
     </Site> 
     <Site siteRoot="/Partner" name="Partner_en"> 
      <siteSettings> 
       <setting name="" value="" /> 
      </siteSettings> 
      <JavaScriptBundles> 
       <file name="" /> 
      </JavaScriptBundles> 
      <CSSBundles> 
       <file name="" /> 
      </CSSBundles> 
     </Site> 
    </Sites> 
</CustomSiteConfiguration> 

所以,首先我开始与站点容器

public class CustomSiteSettingsSection : ConfigurationSection 
{ 
    [ConfigurationProperty("Sites")] 
    [ConfigurationCollection(typeof(SiteCollection), AddItemName="Site")] 
    public SiteCollection Sites 
    { 
     get 
     { 
      return (SiteCollection)base["Sites"]; 
     } 
    }   // end of public SiteCollection Site 
}    // end of public class CustomSiteSettings : ConfigurationSection { 

然后我加入了SiteCollection对网站的收集要素

public class SiteCollection : ConfigurationElementCollection 
{ 
    // Constructor 
    public SiteCollection() { } 

    public SiteElement this[int index] 
    { 
     get { return (SiteElement)BaseGet(index); } 
     set 
     { 
      if (BaseGet(index) != null) 
      { 
       BaseRemoveAt(index); 
      } 
      BaseAdd(index, value); 
     } 
    }  // end of public SiteElement this[int index] 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new SiteElement(); 
    }  // end of protected override ConfigurationElement CreateNewElement() 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((SiteElement)element).name; 
    } 
}   // end of public class SiteCollection : ConfigurationElementCollection 

然后我添加了具有可选值的网站的定义

public class SiteElement : ConfigurationElement 
{ 
    // Constructor 
    public SiteElement() { } 

    [ConfigurationProperty("name", IsRequired = true, IsKey = true)] 
    public String name 
    { 
     get { return (String)this["name"]; } 
     set { this["name"] = value; } 
    }   // end of public String name 

    [ConfigurationProperty("siteRoot", IsRequired = true)] 
    public String siteRoot 
    { 
     get { return (String)this["siteRoot"]; } 
     set { this["siteRoot"] = value; } 
    }   // end of public String siteRoot 

    [ConfigurationProperty("siteSettings", IsRequired=false)] 
    [ConfigurationCollection(typeof(SiteSettingsElementCollection), AddItemName = "setting")] 
    public SiteSettingsElementCollection siteSettings 
    { 
     get 
     { 
      return (SiteSettingsElementCollection)base["siteSettings"]; 
     } 
    }   // end of public SiteCollection Site 
}    // end of public class SiteElement : ConfigurationElement 

接下来,我添加了站点设置集合

public class SiteSettingsElementCollection : ConfigurationElementCollection 
{ 
    // Constructor 
    public SiteSettingsElementCollection() { } 

    public SiteSettingElement this[int index] 
    { 
     get { return (SiteSettingElement)BaseGet(index); } 
     set 
     { 
      if (BaseGet(index) != null) 
      { 
       BaseRemoveAt(index); 
      } 
      BaseAdd(index, value); 
     } 
    }  // end of public SiteElement this[int index] 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new SiteSettingElement(); 
    }  // end of protected override ConfigurationElement CreateNewElement() 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((SiteSettingElement)element).name; 
    } 
}   // end of public class SiteCollection : ConfigurationElementCollection 

最后,我加入了设置元素定义

public class SiteSettingElement : ConfigurationElement 
{ 
    public SiteSettingElement() { } 

    [ConfigurationProperty("name", IsRequired=true, IsKey=true)] 
    public String name 
    { 
     get { return (String)this["name"]; } 
     set { this["name"] = value; } 
    }   // end of public String name 

    [ConfigurationProperty("value", IsRequired = true)] 
    public String value 
    { 
     get { return (String)this["value"]; } 
     set { this["value"] = value; } 
    }   // end of public String value 
}    // end of public class SiteSettingElement : ConfigurationElement 

在这一点上,我只是重复同样的两个包。最后,这一切工作,并允许可选的设置和部分。

相关问题