如何访问为具有ConfigurationProperty属性的类生成的ConfigurationPropertyAttr

本文关键字:属性 ConfigurationProperty ConfigurationPropertyAttr 何访问 访问 | 更新日期: 2023-09-27 18:09:06

我有一个相当大的配置应用程序。每个参数的所有配置部分都是用。net ConfigurationProperty属性定义的,这些属性都有一个DefaultValue属性。

由于我们的产品在不同国家之间变得高度可定制,甚至在一个国家的客户,有一个Configurator.exe可以编辑大配置文件。

在这个Configurator.exe中,如果我可以访问已经定义的许多许多DefaultValue属性,那将是非常酷的…但是,我不知道如何访问由这些属性生成的那些属性。

例如:

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

我需要的是通过编程方式访问值WantedValue,尽可能的通用。(否则,我要手动浏览所有定义的ConfigSections,收集每个字段的DefaultValues,然后检查我的配置器使用这些值…)

MyCollection.GetListConfigurationProperty()将返回ConfigurationPropertyAttribute对象,我可以在上面调用属性:Name, IsRequired, IsKey, IsDefaultCollection和DefaultValue

如何访问为具有ConfigurationProperty属性的类生成的ConfigurationPropertyAttr

这是我碰巧在做我想做的事情上取得成功的课程:

我为它提供ConfigSection类型,我想要的字段的默认值的类型,以及我想要的字段的字符串值。

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);
    }
}