Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FxCop抱怨:暴露了具体的xml类型,改进不好_C#_Xml_Xpath_Fxcop - Fatal编程技术网

C# FxCop抱怨:暴露了具体的xml类型,改进不好

C# FxCop抱怨:暴露了具体的xml类型,改进不好,c#,xml,xpath,fxcop,C#,Xml,Xpath,Fxcop,我想保存某些类,因为xml序列化在我的例子中无法做到这一点,所以我将手动将值保存到xml文档中。工作很好,但FxCop不喜欢它,因为FxCop通常会给出很好的建议和理由,说明我不应该以某种方式做事,所以我尽量让它开心 这一次,我不明白这是怎么一种进步 这就是我所拥有的: public void Save() { XmlDocument doc = new XmlDocument(); XmlNode XmlNodeJob = doc.CreateElement("Job"

我想保存某些类,因为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数据源

现在我最棒的解决方案是:

通过这种方式,我用另一种方法获得了我的节点,FxCop很高兴,但我真的没有看到改进,我需要一个节点来添加内容,而不是阅读内容

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


我的解决方案很简单,可以满足我的所有要求,但FxCop似乎不允许使用明显更糟糕、更复杂的解决方案。

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

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


FxCop是说您应该使用接口,而不是接口的具体实现。它可能检测到,在您的
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
}
public int Sum(IEnumerable<int> parameter)
{
    int tmp = 0;
    foreach (int i in parameter)
    {
        tmp += i;
    }

    return i;
}

为了澄清为什么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
ObservableCollection
…等等。

我发现使用XElementsLinqToXml正是我所寻找的更简单、更强大的方式,更少的FxCop和接口问题。

我的理解是,您应该而不是实现它的类。相当普遍的概念。有时它会让事情变得更容易,但有时却不那么容易。这是“meh”指南之一。
XmlNode
实现了
IXPathNavigable
,请参见y答案。你可以很容易地修复这个警告。我想,你也可以将这个方法内部化来解决你的问题。因为我和另外一个坐在离我不到两米远的人将是世界上唯一使用这个方法的人,我将忽略这个警告。谢谢=)我真的认为如果使用了具体类的特定功能,FxCop不会抛出这个警告。接口本身没有具体类所需的功能,我需要显式地将其转换回XmlNode以使用它。@IswMA尝试并遵守FxCop等有意义的东西是一种良好的做法,例如面向公众的API(面向公众的API可以在同一家公司内),但这不是全部。如果您不同意某些规则,只需将它们排除在外。重新定义
XmlNode
的可能性有多接近于零?
public int Sum(IEnumerable<int> parameter)
{
    int tmp = 0;
    foreach (int i in parameter)
    {
        tmp += i;
    }

    return i;
}