2011-09-19 67 views
1

我有一個非常大的配置應用程序。 每個參數的所有配置部分都使用.Net ConfigurationProperty屬性定義,它們都具有DefaultValue屬性。如何訪問爲具有屬性的類生成的ConfigurationPropertyAttribute ConfigurationProperty

由於我們的產品在各個國家甚至是一個國家的客戶之間變得非常可定製,因此有一個Configurator.exe可以編輯大型配置文件。

在這個Configurator.exe中,如果我可以訪問許多已定義的許多DefaultValue屬性,那將是非常酷的......但是,我沒有關於如何訪問這些屬性的一個單獨想法屬性生成的屬性。

例如爲:

public class MyCollection : ConfigurationElementCollection 
{ 
    public MyCollection() 
    { 
    } 

    [ConfigurationProperty(MyAttr,IsRequired=false,DefaultValue=WantedValue)] 
    public MyAttributeType MyAttribute 
    { 
     //... property implementation 
    } 
} 

我需要的是通過編程訪問該值WantedValue,最一般越好。 (否則,我要手動瀏覽所有定義的部分,收集每個字段的DefaultValues,然後檢查我的配置器使用這些值...)

看起來像這樣:MyCollection.GetListConfigurationProperty()將返回ConfigurationPropertyAttribute可以調用屬性的對象:Name,IsRequired,IsKey,IsDefaultCollection和DefaultValue

任何想法?

回答

0

這是我碰巧實現其成功在什麼我想要做的類:

我與ConfigSection類型,我想現場的defualt值的類型,以及字符串值餵它我想要的領域。

public class ExtensionConfigurationElement<TConfigSection, UDefaultValue> 
    where UDefaultValue : new() 
    where TConfigSection : ConfigurationElement, new() 
{ 
    public UDefaultValue GetDefaultValue(string strField) 
    { 
     TConfigSection tConfigSection = new TConfigSection(); 
     ConfigurationElement configElement = tConfigSection as ConfigurationElement; 
     if (configElement == null) 
     { 
      // not a config section 
      System.Diagnostics.Debug.Assert(false); 
      return default(UDefaultValue); 
     } 

     ElementInformation elementInfo = configElement.ElementInformation; 

     var varTest = elementInfo.Properties; 
     foreach (var item in varTest) 
     { 
      PropertyInformation propertyInformation = item as PropertyInformation; 
      if (propertyInformation == null || propertyInformation.Name != strField) 
      { 
       continue; 
      } 

      try 
      { 
       UDefaultValue defaultValue = (UDefaultValue) propertyInformation.DefaultValue; 
       return defaultValue; 
      } 
      catch (Exception ex) 
      { 
       // default value of the wrong type 
       System.Diagnostics.Debug.Assert(false); 
       return default(UDefaultValue);     
      } 
     } 

     return default(UDefaultValue); 
    } 
} 
相關問題