7

我(希望)设置了我自己设计的 ConfigurationElementCollection,并以电子邮件为键。怎么办?很难在网上真正找到。我如何能:

  1. 遍历它?

  2. 查看是否存在特定元素?

  3. 得到一个特定的元素?

...给定:

    YourConfigElement config = 
   ConfigurationManager.GetSection("YourSectionName") as YourConfigElement;

部分回答

1.

 foreach (X x in config.XCollection) 
             <code here>

2. 将“此处的代码”替换为

 { 
    if (x.Y == needle) 
    {
       hasIndeed = true;
       break;
    }
 }

3. 将“此处的代码”替换为

 { if (x.Y == needle) 
       cameUpWith = x;
       break;
 }

微臭。

4

2 回答 2

8

你想要的是你自己的通用ConfigurationElementCollection基类,它实现了IList<T>. 然后,您可以从中继承所有配置集合,并减少创建配置集合时需要做的工作量。

public abstract class BaseConfigurationElementCollection<TConfigurationElementType> : ConfigurationElementCollection, IList<TConfigurationElementType> where TConfigurationElementType : ConfigurationElement, IConfigurationElementCollectionElement, new()
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new TConfigurationElementType();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((TConfigurationElementType)element).ElementKey;
    }

    public IEnumerator<TConfigurationElement> GetEnumerator()
    {
        foreach (TConfigurationElement type in this)
        {
            yield return type;
        }
    }

    public void Add(TConfigurationElementType configurationElement)
    {
        BaseAdd(configurationElement, true);
    }

    public void Clear()
    {
        BaseClear();
    }

    public bool Contains(TConfigurationElementType configurationElement)
    {
        return !(IndexOf(configurationElement) < 0);
    }

    public void CopyTo(TConfigurationElementType[] array, int arrayIndex)
    {
        base.CopyTo(array, arrayIndex);
    }

    public bool Remove(TConfigurationElementType configurationElement)
    {
        BaseRemove(GetElementKey(configurationElement));

        return true;
    }

    bool ICollection<TConfigurationElementType>.IsReadOnly
    {
        get { return IsReadOnly(); }
    }

    public int IndexOf(TConfigurationElementType configurationElement)
    {
        return BaseIndexOf(configurationElement);
    }

    public void Insert(int index, TConfigurationElementType configurationElement)
    {
        BaseAdd(index, configurationElement);
    }

    public void RemoveAt(int index)
    {
        BaseRemoveAt(index);
    }

    public TConfigurationElementType this[int index]
    {
        get
        {
            return (TConfigurationElementType)BaseGet(index);
        }
        set
        {
            if (BaseGet(index) != null)
            {
                BaseRemoveAt(index);
            }
            BaseAdd(index, value);
        }
    }
}

多做一点工作,您也可以拥有一个字典集合。

于 2010-07-02T08:31:43.397 回答
2

我不完全理解你的问题是什么 - 但基本上,如果你有一个自定义配置元素,你应该能够使用类似的东西从配置文件中检索它:

YourConfigElement config = 
    ConfigurationManager.GetSection("YourSectionName") as YourConfigElement ;

一旦你有了你的配置元素,你就可以随心所欲地使用它——你可以实现你要求的所有东西——检查元素的存在,获取特定的元素等。

您还应该在 CodeProject 上查看 Jon Rista 关于 .NET 2.0 配置的三部分系列以获取更多信息 - 也许这些文章将帮助您解锁配置“挑战”;-)

强烈推荐,写得很好,非常有帮助!

如果您还没有发现它 - Codeplex 上有一个出色的配置部分设计器,它可以快速直观地设计配置部分和集合,并为您编写所有粘稠的胶水代码 - 确实非常方便!

马克

于 2010-05-06T20:26:02.670 回答