2016-05-23 48 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 

在這一點上,我只是重複同樣的兩個包。最後,這一切工作,並允許可選的設置和部分。

相關問題