FxCop投诉:暴露的具体xml类型和糟糕的改进

Ott*_*inz 6 c# xml xpath fxcop

我想保存某些类,因为在我的情况下xml-serialization不会这样做我将值手动保存到xml文档中.工作正常,但FxCop不喜欢它,因为FxCop通常给出了很好的建议和原因,为什么我不应该以某种方式做事情,我试着让它快乐.

这一次,我不明白这是一个改进.

这就是我所拥有的:

public void Save()
{
      XmlDocument doc = new XmlDocument();
      XmlNode XmlNodeJob = doc.CreateElement("Job");
      doc.AppendChild(XmlNodeJob);
      OtherclassSave2(XmlNodeJob);//Node as Parameter
 }

 public void OtherclassSave2(XmlNode node)
 {

 }
Run Code Online (Sandbox Code Playgroud)

这就是FxCop所抱怨的: "修改成员'OtherclassSave2(XmlNode)',以便它不再公开具体类型'XmlNode'.使用IXPathNavigable来表示XML数据源."

现在我的解决方案很棒:

    public void Save()
    {
        XmlDocument doc = new XmlDocument();
        XmlNode XmlNodeJob = doc.CreateElement("Job");
        doc.AppendChild(XmlNodeJob);
        OtherclassSave2(XmlNodeJob.CreateNavigator());//Interface from a node's navigator
    }

    public void OtherclassSave2(IXPathNavigable nav)
    {
        XmlNode node = (XmlNode)(nav.CreateNavigator().UnderlyingObject);

    }
Run Code Online (Sandbox Code Playgroud)

这样我就可以在另一个方法中得到我的节点而且FxCop很高兴,但我真的没有看到改进,我需要一个节点来添加内容,而不是要阅读.

我虽然将void SaveInThisNode(XmlNode)更改为XmlNode GetMeTheNode()但是要通过CreateElements创建节点,我需要XmlDocument对象,我不允许将其用作参数,但我可以在每一步创建新的XmlDocuments,很好.

我的解决方案很简单,并且可以完成我希望它做的所有事情,但是FxCop似乎不允许解决方案显然更糟,更复杂.

Bro*_*ski 2

只是建议您不要在方法签名中耦合 XmlNode 的具体实现。这允许您更改内部实现,而不会影响使用该类的任何内容。

如果您需要具体类的特定功能,建议您可以忽略该警告。如果这是一个面向公众的 API,您应该尝试尽可能多地解耦,这将使您可以自由地更改实现,而更改方法签名的机会更少,从而迫使 API 的使用者更改其实现。

CA1059:成员不应公开某些具体类型