如何访问为具有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这是我碰巧在做我想做的事情上取得成功的课程:
我为它提供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);
}
}