Как получить доступ к 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);
}
}