1

我有这段代码(要复制的示例):

public class ObjectBase<T>
{
}
public abstract class ExportBase
{
    public void ExportData<T>(string path, T data, string filename)
                where T : ObjectBase<T>
    {
        // Several verifications on data.
        // Example:
        if (data != null)
        {
            this.InnerExport(this.GetFileName<T>(path, filename), data);
        }
    }
    protected abstract void InnerExport<T>(string path, T data)
                where T : ObjectBase<T>;

    public string GetFileName<T>(string path, string filename)
    {
        // Code.
        return "TEST";
    }
}
internal sealed class XmlExport : ExportBase
{
    protected override void InnerExport<T>(string path, T data)
    {
        // Code.
    }
}

我不希望 XmlExport 可见(在我的类库中)也不继承(密封)。

使用 FxCop 10.0,我有一个CA1047:DoNotDeclareProtectedMembersInSealedTypes

名称: (FxCopCmd)
不要在密封类型中声明受保护的成员。

说明: (FxCopCmd)
密封类型无法扩展,受保护成员仅在您可以扩展声明类型时才有用。密封类型不应声明受保护的成员。

如何修复: (FxCopCmd)
将成员 'XmlExport.InnerExport(string, T)' 设为私有、公共或内部(Visual Basic 中的朋友)。

信息:(FxCop)
密封类型无法扩展,受保护成员仅在您可以扩展声明类型时才有用。密封类型不应声明受保护的成员。

但我不能将保护更改为私有:虚拟或抽象成员不能是私有的。也不公开(在这里没有意义)。

我知道我可以使用 a SuppressMessage,但我想知道是否有更好的方法(包括修改类)。

谢谢。

4

2 回答 2

1

这似乎是由于基本 InnerExport 方法声明上的通用约束(“where T : ObjectBase”)触发的规则中的错误。您应该将违规视为误报。如果您感觉特别感兴趣,还可以在https://connect.microsoft.com/visualstudio/上报告该错误。

于 2013-05-31T16:25:48.253 回答
0

internal如果您只在库中使用它,则可以更改为 protected 。但是您还必须在覆盖时将其更改为internalin 。XmlExport

于 2013-05-31T15:37:16.893 回答