Как получить доступ к ConfigurationPropertyAttribute, сгенерированному для класса с атрибутами ConfigurationProperty

У меня есть приложение с довольно большой конфигурацией. Все разделы конфигурации для каждого параметра определяются с помощью атрибутов.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

Любая идея?

1 ответ

Решение

Это тот класс, которого мне довелось достичь, который преуспел в том, что я хотел сделать:

Я передаю его с типом 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);
    }
}
Другие вопросы по тегам