有很多例子可以解释如何创建自己的ConfigurationElementCollection,例如:Stackoverflow: How to implement your own ConfigurationElementCollection?
您必须覆盖的其中一项功能是GetElementKey:
protected override object GetElementKey(ConfigurationElement element)
{
return ((ServiceConfig) element).Port;
}
其中属性Port的定义如下:
[ConfigurationProperty("Port", IsRequired = true, IsKey = true)]
public int Port
{
get { return (int) this["Port"]; }
set { this["Port"] = value; }
}
我的配置有几个看起来非常相似的ConfigurationElementCollections。由于密钥的标识符,GetElementKey函数是唯一禁止使用通用ConfigurationElementCollection的函数。 ConfigurationPropertyAttribute已经通知我哪个属性是关键。
是否可以通过ConfigurationPropertyAttribute获取Key属性?
代码就像:
public class ConfigCollection<T> : ConfigurationElementCollection where T: ConfigurationElement, new()
{
protected override Object GetElementKey(ConfigurationElement element)
{
// get the propertyInfo of property that has IsKey = true
PropertyInfo keyPropertyInfo = ...
object keyValue = keyPropertyInfo.GetValue(element);
return keyValue;
}
答案 0 :(得分:0)
是的,您可以获取该元素的所有属性,并查找具有ConfigurationPropertyAttribute
IsKey == true
的元素:
protected override object GetElementKey(ConfigurationElement element)
{
object key = element.GetType()
.GetProperties()
.Where(p => p.GetCustomAttributes<ConfigurationPropertyAttribute>()
.Any(a => a.IsKey))
.Select(p => p.GetValue(element))
.FirstOrDefault();
return key;
}