gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 01:51:09 27 4
gpt4 key购买 nike

我想保存某些类,因为在我的情况下 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com