1

我一直在用 StyleCop 清理我的项目文件,但我有以下无法解决的问题

PasswordPolicyCollection.cs (13): CA2214 : Microsoft.Usage : 'PasswordPolicyCollection.PasswordPolicyCollection()' 包含一个调用链,该调用链导致对类定义的虚拟方法的调用。查看以下调用堆栈以了解意外后果: PasswordPolicyCollection..ctor() ConfigurationElementCollection.CreateNewElement():ConfigurationElement PasswordPolicyCollection.Add(PasswordPolicy):Void ConfigurationElementCollection.BaseAdd(ConfigurationElement):Void

这是代码:

using System.Configuration;

public class PasswordPolicyCollection : ConfigurationElementCollection
{
    public PasswordPolicyCollection()
    {
        var passwordPolicy = (PasswordPolicy)this.CreateNewElement();
        this.Add(passwordPolicy);
    }

    public override ConfigurationElementCollectionType CollectionType
    {
        get
        {
            return ConfigurationElementCollectionType.AddRemoveClearMap;
        }
    }

    public new PasswordPolicy this[string name]
    {
        get
        {
            return (PasswordPolicy)BaseGet(name);
        }
    }

    public PasswordPolicy this[int index]
    {
        get
        {
            return (PasswordPolicy)BaseGet(index);
        }

        set
        {
            if (BaseGet(index) != null)
            {
                BaseRemoveAt(index);
            }

            BaseAdd(index, value);
        }
    }

    public void Add(PasswordPolicy passwordPolicy)
    {
        this.BaseAdd(passwordPolicy);
    }

    public int Indexof(PasswordPolicy policy)
    {
        return BaseIndexOf(policy);
    }

    public void Remove(PasswordPolicy url)
    {
        if (BaseIndexOf(url) >= 0)
            BaseRemove(url.Name);
    }

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

    public void Remove(string name)
    {
        BaseRemove(name);
    }

    public void Clear()
    {
        BaseClear();
    }

    protected override void BaseAdd(ConfigurationElement policy)
    {
        BaseAdd(policy, false);
    }

    protected override sealed ConfigurationElement CreateNewElement()
    {
        return new PasswordPolicy();
    }

    protected override object GetElementKey(ConfigurationElement policy)
    {
        return ((PasswordPolicy)policy).Name;
    }
}

有任何想法吗?

4

2 回答 2

4

在构造函数中调用 Add 方法。在此方法中,您调用非密封 BaseAdd 方法,这就是您收到警告的原因。要消除此代码分析警告,您必须密封 BaseAdd 方法

protected override sealed void BaseAdd(ConfigurationElement policy)
{
    BaseAdd(policy, false);
}
于 2013-10-25T10:16:27.020 回答
3

好吧,实际上这不是 stylecop 警告,而是代码分析 (FxCop) 警告。

您在构造函数中调用虚拟方法(CreateNewElement您已被覆盖)。一般来说,您不应该这样做,因为构造函数在 C# 中的工作ConfigurationElementCollection.ctor方式是首先调用基本构造函数 ( ),但它将执行CreateNewElement最派生的类,即您已覆盖的类。

请参阅构造函数中的虚拟成员调用

于 2013-10-25T09:58:12.083 回答