StyleCop 问题需要解决 - 包含一个调用链,该调用链导致调用由类定义的虚拟方法
本文关键字:调用 定义 方法 虚拟 解决 包含一 StyleCop 问题 | 更新日期: 2023-09-27 18:36:59
我一直在使用 StyleCop 清理我的项目文件,我有以下无法解决的问题
密码策略集合.cs (13): CA2214 : Microsoft.用法 : '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;
}
}
有什么想法吗?
在构造函数中调用 Add 方法。在此方法中,您调用非密封的 BaseAdd 方法,这就是您收到警告的原因。要摆脱此代码分析警告,您必须密封 BaseAdd 方法
protected override sealed void BaseAdd(ConfigurationElement policy)
{
BaseAdd(policy, false);
}
这不是一个stylecop警告,而是一个代码分析(FxCop)警告。
您正在构造函数中调用虚拟方法(CreateNewElement
已重写)。通常你不应该这样做,因为按照构造函数在 C# 中的工作方式,基构造函数 ( ConfigurationElementCollection.ctor
) 将首先被调用,但它将执行CreateNewElement
派生最多的类,即你已覆盖的类。
请参阅构造函数中的虚拟成员调用