c# - FxCop 投诉 : Exposed concrete xml types and a bad improvement

标签 c# xml xpath fxcop

我想保存某些类,因为在我的情况下 xml 序列化不会这样做,所以我将这些值手动保存到 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)
 {

 }

这就是 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);

    }

这样我就可以用另一种方法获取我的节点,FxCop 很高兴,但我真的看不到任何改进,我需要一个节点来向其中添加内容,而不是要读取的内容。

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

我的解决方案很简单,可以很好地满足我希望它做的所有事情,但 FxCop 似乎不允许解决方案没有明显更糟和更复杂。

最佳答案

FxCop 说您应该使用接口(interface)而不是接口(interface)的具体实现。它可能在您的 OtherclassSave2 中检测到方法参数nav可以用作 IXPathNavigable未指定具体实现(仅使用 IXPathNavigable 公开的成员)。

作为XmlNode工具 IXPathNavigable ,你应该能够写:

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

public void OtherclassSave2(IXPathNavigable node)
{
    // Deal with node using the interface only
}

为了澄清为什么 FxCop 这么说,下面是 FxCop 检测到的问题的最常见示例:

假设你有:

public int Sum(List<int> parameter)
{
    int tmp = 0;
    foreach (int i in parameter)
    {
        tmp += i;
    }

    return i;
}

List<int> lst = new List<int> {3, 4, 5};
int sum = Sum(lst);

作为Sum实现不使用 List<T> 的特定方法类型,将参数类型设置为 List<int> 不是一个好主意因为它会限制你的 Sum 的使用方法。作为Sum实现只使用 foreach ,最好这样写:

public int Sum(IEnumerable<int> parameter)
{
    int tmp = 0;
    foreach (int i in parameter)
    {
        tmp += i;
    }

    return i;
}

所以你可以调用Sum与其他类型 List<T> : ObservableCollection<T> ...等

关于c# - FxCop 投诉 : Exposed concrete xml types and a bad improvement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9190621/

相关文章:

c# - 在C#中使用PHP的Webservice

xml - 如何在 Postgresql 中查询 XML 列?

java - 什么是 XML BOM 以及如何检测它?

selenium - 以下场景如何使用子元素点击父元素

xml - 在TCL tDOM中解析具有多个子项的XML数据

python - Scrapy错误: Spider must return Request, BaseItem或无,得到 'dict'

C#:这个字段赋值安全吗?

c# - 如何将这些调用放在 SqlTransaction 中?

c# - 一对一映射问题

c++ - 使用 Xerces-C++ 解析递归 XML 模式 (XSD) 时出现段错误