- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我想保存某些类,因为在我的情况下 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/
我是一名优秀的程序员,十分优秀!