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

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

0 голосов
/ 21 сентября 2011

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

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