天道酬勤,学无止境

如何让 XSD.exe 为我生成合适的类,以便我可以创建一个很好的 XML(how to ask XSD.exe to generate proper class for me, so that i can create a fine XML)

问题

我从 Visual Studio 2010 创建了一个 XSD 文件,

然后我使用xsd /c mydemo.xsd为我生成类,以便我可以在运行时创建一个 XML 文件。

但是,当我使用该类、填充一些值并序列化对象时,XML 文件对我来说并不好看。

这是我的 XSD 文件 单击此处查看

我期望的 XML 文件是单击此处查看(从 Visual Studio“示例 XML”生成)

但是当我尝试序列化它时,XML文件是这样的 点击这里查看

格式完全不一样

例如

期待:

<ColumnInfo> 
  <Column Type="Type1" DisplayValue="DisplayValue1" Key="Key1"/> 
  <Column Type="Type2" DisplayValue="DisplayValue2" Key="Key2"/> 
  <Column Type="Type3" DisplayValue="DisplayValue3" Key="Key3"/> 
</ColumnInfo>

但生成结果是这样的:

<columnInfoField>
  <ColumnType>
    <displayValueField>Display value for key 1</displayValueField>
    <keyField>key1</keyField>
    <typeField>string</typeField>
  </ColumnType>
  <ColumnType>
    <displayValueField>Display value for key 2</displayValueField>
    <keyField>key2</keyField>
    <typeField>int</typeField>
  </ColumnType>
  <ColumnType>
    <displayValueField>Display value for key 3</displayValueField>
    <keyField>key3</keyField>
    <typeField>long</typeField>
  </ColumnType>
</columnInfoField>

我实现的用于序列化报告的代码是:

http://msdn.microsoft.com/en-us/library/ms731073.aspx

DataContractSerializer dcs = new DataContractSerializer(typeof(Report));
using (XmlDictionaryWriter xdw = XmlDictionaryWriter.CreateTextWriter(File.Create(@"C:\demo\schema\output.xml"), Encoding.UTF8))
{
  dcs.WriteObject(xdw, report);
}

不知道为什么我不能使用“XmlSerializer”,当我使用它时,它会抱怨无法转换数组类型的东西......

无法生成临时类 (result=1)。
错误 CS0030:无法将类型“ColumnValueType[]”转换为“ColumnValueType”
错误 CS0029:无法将类型“ColumnValueType”隐式转换为“ColumnValueType[]”

那么,有没有人可以给我一些建议,我该如何修复我的 XML 格式???

回答1

xsd.exe 有一个错误 - 请看这篇博文:http://satov.blogspot.com/2006/12/xsdexe-generated-classes-causing.html

回答2

数据协定序列化程序具有与 XmlSerializer 不同的规则。 为什么不先尝试 XmlSerializer,然后看看输出是否“正确”。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Visual Studio 2010:IDE 中类的 XML XSD 架构(Visual Studio 2010 : XML XSD Schema to Classes within the IDE)
    问题 每当我需要从 XML XSD 架构创建类文件时,我都会在 VS 中使用 .NET xsd.exe 工具和预构建事件,以确保我的类和架构在构建时彼此同步。 这当然工作正常,但是...... 我注意到,如果 XSD 和派生类在同一个项目中,VS 会理解这种关系,并在解决方案资源管理器中直观地将 CS 显示为 XSD 文件的子级。 所以我想知道 Visual Studio 2010 中是否有任何功能可以在 IDE 中为我创建类而不是依赖于预构建脚本? 例如,我会将 XSD 添加到项目中,在某处设置一些选项,然后 VS 接管并为我创建我的类。 VS 2010 是否支持这样的东西? 或者我应该停止思考并继续使用 xsd.exe 和预构建。 编辑我还注意到,在 XSD 文件的属性下,我可以选择设置Custom Tool ,阅读描述这似乎与我的目标很接近,但我不确定此属性的正确用法。 编辑另外,如果有一个解决方案,我需要这个基于VS2010标准的特性/功能。 我宁愿不使用第 3 方插件等 回答1 Visual Studio 2010 本身不包含任何此类供一般使用的功能。 Visual Studio 在 ADO.NET 中类型化数据集的上下文中对这种 XSD 到代码的转换提供了一些有限的支持 - 但这些不是通用解决方案,它们正是针对那种使用场景。 但请查看XSD2Code 插件
  • 在 C# 中从 XML Schema 生成代码有什么限制?(What are the limits to code generation from XML Schema in C#?)
    问题 我已经看到了几个关于使用xsd.exe从 XML 模式生成类的问题的问题,以及关于如何预处理模式(通常使用 XSLT)以在生成之前解决一些棘手方面的建议。 我的问题是是否有可能构建一个 100% 符合 XML Schema 的 C# 代码生成器。 xsd.exe的问题仅仅是它的实现问题,还是指出 XML Schema 和 C# 之间存在根本的不一致? 特别是,我对如何将 XML Schema 中的概念映射到 C# 感兴趣 - 什么是可接受的映射,哪些映射是有争议的,是否存在本质上不可映射的 XML Schema 构造以及是否存在未充分利用的 C# 构造? 是否有提供映射规则的合规性规范,以便可以实施和测试? 编辑:为了清楚起见,我完全知道 XML Schema 不会为我提供完全实现的 C# 接口,我对它是否可以完全映射到 C# 类层次结构感兴趣。 编辑 2:我添加了一个小赏金,因为我有兴趣获得更多细节。 编辑 3:赏金仍然开放,但到目前为止朝着 stakx 前进 - 一个很好的答案,但主要处理如何在 XML 模式中复制 C# 结构,而不是相反。 好的输入虽然。 回答1 有趣的问题。 不久前,我想知道完全相同的事情。 我将展示几个例子来说明我有多远。 我的演示并不完整(考虑到 XML Schema 规范相当全面),但它应该足以展示...... 您可以比xsd.exe
  • C# 如何从数据库填充使用 XSD.EXE 创建的类(C# How to fill class created using XSD.EXE from database)
    问题 通常我会为我的 Web 服务编写一个类并为其添加 XML 序列化。 [XmlRootAttribute(ElementName = "dsXmlSummary", IsNullable=true)] public class Class1 { //declare properties //make database calls to pull data and load properties } 我正在处理一个要求我使用严格 XSD 的项目,我已按照使用 XSD.EXE 工具的说明创建基于 XSD 的类。 我的解释是这个自动生成的类将替换我的普通序列化类。 如果是这种情况,我完全无法将数据加载到类属性中。 我从另一个步行中收集了这个: [WebMethod] public dsXmlSummary getXML() { TextReader reader = new StreamReader("data.xml"); dsXmlSummary ds = (dsXmlSummary)serializer.Deserialize(reader); reader.Close(); } 但是,我拥有的数据位于 SQL 数据库中……我想我应该能够编写一种方法来填充dsXmlSummary类,但是我找不到任何有关执行此操作的文档。 所有的例子都像上面一样,从一个实际的物理 xml
  • 如何为 Web 服务生成 XSD 文件(How to generate XSD files for web service)
    问题 我需要创建将由其他系统使用的 Web 服务 (.NET)。 为了让他们实现将使用我的 Web 服务的逻辑,我需要向他们发送我的 Web 服务的 wsdl 和 XSD 文件。 WSDL 文件不是问题,我会通过传递 wsdl 参数从 .asmx 页面获取它。 但是如何为我的 Web 服务生成合适的 XSD 文件? 我可以使用 XSD.exe 工具并将它的 .wsdl 文件作为参数传递,还是有其他方法? 提前致谢。 回答1 您可以使用disco.exe 实用程序,它允许您将wsdl 和xsd 文件保存在磁盘上,以便这些文件可用于生成客户端代理,而无需访问WSDL Web 地址。 回答2 如果您使用的是 Visual Studio 的专业版(及更高版本),则在打开 XML 文件时,您会找到一个 XML 菜单,其中包含一个可以从中生成 XSD 的项目(创建架构)。 我相信它虽然在引擎盖下使用了xsd.exe 。 请参阅 MSDN。 回答3 您可以在服务 url 的末尾添加“?xsd=1”以获取架构。 即如果您的 Web 服务 URL 是 ://my_ws_service:9080/service/name 那么您可以使用 ://my_ws_service:9080/service/name?WSDL 获取 WSDL 并且您可以使用 ://my_ws_service:9080
  • 提升序列化与谷歌协议缓冲区? [关闭](boost serialization vs google protocol buffers? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 改善这个问题 有使用过这些库的经验的人对他们更喜欢哪一个有任何评论吗? 使用中是否有任何性能差异或困难? 回答1 我在这两个系统上都玩过一些,没什么大不了的,只是一些简单的hackish 东西,但我觉得你应该如何使用这些库有真正的不同。 使用 boost::serialization,您首先编写自己的结构/类,然后添加归档方法,但您仍然留下一些非常“瘦”的类,它们可以用作数据成员、继承等。 使用协议缓冲区,即使是为简单结构生成的代码量也相当可观,生成的结构和代码更适合用于操作,并且您可以使用协议缓冲区的功能将数据传输到您自己的内部结构和从您自己的内部结构传输数据. 回答2 我已经使用 Boost Serialization 很长时间了,只是挖掘了协议缓冲区,我认为它们没有完全相同的目的。 BS(没有看到)将您的 C++ 对象保存到流中,而 PB 是您读取/读取的交换格式。 PB 的数据模型要简单得多:您可以获得各种整数和浮点数、字符串、数组、基本结构,仅此而已。 BS 允许您一步直接保存所有对象。 这意味着使用 BS 您可以在线获得更多数据,但您不必重建所有对象结构,而协议缓冲区更紧凑,但在读取存档后还有更多工作要做。 顾名思义
  • 使用 XmlReader 和 xsd.exe 中的类反序列化 Xml(Deserialize Xml Using XmlReader and Class from xsd.exe)
    问题 好的,我在学习 XmlSerializer 时遇到了一些障碍。 我遵循了所有推荐的步骤,但我的程序没有返回任何内容,或者返回 null。 我创建了一个 XML 文件,如下所示: <?xml version='1.0' encoding='UTF-8' ?> <WeeklyJobs> <DailyJobs Date = "02/03/2012"/> <DailyJobs Date = "02/04/2012" TotalJobs = "2"> <Jobs> <Job JobName = "Job Name" Description = "Description"/> <Job JobName = "Job Name" Description = "Description"/> </Jobs> </DailyJobs> <DailyJobs Date = "02/05/2012" TotalJobs = "1"> <Jobs> <Job JobName = "Job Name" Description = "Description"/> </Jobs> </DailyJobs> <DailyJobs Date = "02/06/2012" TotalJobs = "2"> <Jobs> <Job JobName = "Job Name" Description =
  • 使用 xsd.exe 生成的类反序列化可为空值(Deserialization of nullable value with xsd.exe generated class)
    问题 xsd.exe 生成类的可空值回答了为什么生成的类具有 *Specified 字段和属性,以及它如何用于序列化XML 文件,但我如何在反序列化期间设置此值? 我有一个生成的类,定义如下: /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.caiso.com/soa/2006-06-13/StandardOutput.xsd")] public partial class EventLog { private System.DateTime creationTimeField; private bool creationTimeFieldSpecified; /// <remarks/> public System.DateTime
  • Linq to Xml VS XmlSerializer VS DataContractSerializer(Linq to Xml VS XmlSerializer VS DataContractSerializer)
    问题 在我的web method ,我得到了某个第三方 C# 实体类的对象。 实体类只不过是DataContract 。 这个实体类非常复杂,具有各种类型的属性,有些属性也是集合。 当然,那些链接类型也是 DataContracts。 我想将该 DataContract 实体序列化为 XML,作为我的 Web 服务的业务逻辑的一部分。 我不能直接使用DataContractSerializer (在我在 web 方法中收到的对象上),因为 XML 模式完全不同。 因此,DataContractSerializer 生成的 XML 不会根据架构进行验证。 我无法总结我应该遵循的实施方法。 我可以想到以下实现方法: LINQ to XML - 这看起来不错,但我需要为每种类型的对象手动创建 XML 树(即类实例的元素或 XML 表示)。 由于实体类很多,而且它们相互链接,我认为手动编写 XML 元素的工作量太大。 此外,当实体类引入一些新属性时,我将不得不不断修改 XML 树。 不仅如此,我生成 XML 树的代码看起来有点笨拙(至少在外观上),将来其他开发人员将更难维护/更改; 他/她必须仔细查看它才能理解 XML 是如何生成的。 XmlSerializer - 我可以编写自己的实体类来表示我想要的 XML 结构。 现在,我需要将传入对象的详细信息复制到我自己的类的对象中。
  • 覆盖或扩展 UIColor 以支持某些协议(Overriding or extending UIColor to support certain protocols)
    问题 我正在尝试子类化或扩展 UIColor 以支持一些协议。 假设我的协议如下所示: public protocol MyProtocol { init(myValue: Any) throws } 出于某种原因,我无法实现它,我不知道为什么。 这适用于所有其他类: class MyTestClass:SomeOtherClass, MyProtocol{ required init(myValue: Any) throws{ super.init(someOtherClassInitializer:Any) } } 没有问题。 但是,如果我尝试使用 UIColor 执行此操作,则会出现错误。 class MyColor:UIColor, MyProtocol{ required init(myValue: Any) throws { super.init(red: 0, green: 0, blue: 0, alpha: 1) } } 首先,它抱怨required:Coder -init。 好的,提供那个。 致命错误很好。 然后它抱怨另一个初始化。 它说 'required' 初始值设定项 'init(_colorLiteralRed:green:blue:alpha:)' 必须由 'UIColor' 的子类提供 奇怪的弯曲,但还好。 让我们也补充一下。 我点击“修复”
  • 有什么工具可以从XML实例文档生成XSD架构吗? [关闭](Any tools to generate an XSD schema from an XML instance document? [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 7年前关闭。 改善这个问题 我正在寻找一种工具,该工具将使用XML实例文档并输出相应的XSD架构。 我当然认识到,与手动创建模式相比,生成的XSD模式将受到限制(它可能不会处理可选或重复的元素或数据约束),但至少可以作为一个快速的起点。 回答1 Microsoft XSD推理工具是一个很好的免费解决方案。 许多XML编辑工具(例如XmlSpy(由@Garth Gilmour提及)或OxygenXML Editor)也具有该功能。 不过,它们相当昂贵。 BizTalk Server也具有XSD推断工具。 编辑:我刚刚发现了.net XmlSchemaInference类,因此,如果您使用的是.net,则应考虑 回答2 您可以使用开放源代码和跨平台选项:Apache的XMLBeans中的inst2xsd。 我觉得它非常有用和容易。 只需下载,解压缩并播放(需要Java)。 回答3 董里是这里最好的选择。 开源和跨平台(尽管需要Java) 从董里网站: Trang在XML的不同模式语言之间转换。 它支持以下语言 RELAX NG(XML语法) RELAX NG紧凑语法 XML 1.0 DTD W3C
  • 将 XML 反序列化为 XSD 生成的类的问题(Trouble with XML Deserialization into XSD generated classes)
    问题 我有一个相当详细的 xml 文件。 下面是顶级节点(我已经包含了椭圆,因为低级节点都格式良好并正确填充了数据): <?xml version="1.0" encoding="UTF-8"?> <config> <Models>...</Models> <Data>...</Data> </config> 我使用 Visual Studio 2008 命令提示符创建了一个 xsd 文件: xsd sample.xml 这很好地生成了 xsd 文件。 然后我使用以下命令从 xsd 自动生成类: xsd sample.xsd /classes 为了将 xml 文件反序列化为类对象,我使用了 helper 类中的 read 函数: public class XmlSerializerHelper<T> { public Type _type; public XmlSerializerHelper() { _type = typeof(T); } public void Save(string path, object obj) { using (TextWriter textWriter = new StreamWriter(path)) { XmlSerializer serializer = new XmlSerializer(_type); serializer
  • .NET XSD导入程序创建不可序列化的类(.NET xsd importer creates unserializable class)
    问题 我正在使用.NET XSD.EXE导入程序从一组XSD文件生成C#类。 当我尝试将其中一个类序列化为XML时,它失败了( InvalidOperationException ),当我将其挖掘时发现其中一个创建的类似乎是错误的。 以下是相关的XSD代码: <xsd:complexType name="SuccessType"> <xsd:annotation> <xsd:documentation>Indicates in a response message that a request was successfully processed.</xsd:documentation> </xsd:annotation> <xsd:sequence> <xsd:element ref="Warnings" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <!-- .. snip .. --> <xsd:element name="Warnings" type="WarningsType"> <xsd:annotation> <xsd:documentation>The processing status of a business message and any related
  • 如何使用 XSD.exe 从 C# 类型生成 XML 架构,以便将 [XmlAttribute] 属性映射到所需的 XML 属性?(How to generate XML Schema from C# type with XSD.exe such that [XmlAttribute] property is mapped to required XML attribute?)
    问题 简而言之,当我使用 XSD.exe(Visual Studio 2012 附带的)从此类生成 XML 架构文件时: [Serializable] public class Person { [XmlAttribute] public string Name { get; set; } [XmlAttribute] public int Age { get; set; } } 我得到这个结果: <?xml version="1.0" encoding="utf-8"?> <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Person" nillable="true" type="Person" /> <xs:complexType name="Person"> <xs:attribute name="Name" type="xs:string" /> <xs:attribute name="Age" type="xs:int" use="required" /> </xs:complexType> </xs:schema> 请注意, Age属性在生成的模式中被指定为 required (它有use="required"
  • 将 Actionscript 语法转换为 Objective C(Converting Actionscript syntax to Objective C)
    问题 我有一个我在 Actionscript 3 中编写的游戏,我希望移植到 iOS。 游戏有大约 9k LOC 分布在 150 个类中,大多数类用于数据模型、状态处理和级别生成,所有这些都应该易于移植。 然而,在所有这些文件中手动重新调整语法的想法并不太吸引人。 是否有工具可以帮助我加快此过程? 我不是在这里寻找神奇的工具,也不是在寻找交叉编译器,我只是想帮助转换我的源文件。 回答1 我不知道有什么工具,但如果真的有很多(简单的)代码要转换,这就是我尝试解决您的问题的方式。 我确信我的建议对于非常特定于 flash 的代码部分(所有 DisplayObject 的东西?)并没有那么有用,并且对您的许多逻辑也没有那么有用。 但是建造起来会很有趣! :-) 部分自动转换应该是可能的,特别是如果对象只是“数据容器”,请注意将过多的 as3-idiom 带到objective-c,但它可能并不总是合适的。 除非您想为 as3 创建自己的(半)解析器,否则您需要某种解析器,显然 FlexPMD 有一个(从未使用过),而且可能还有其他的。 使用解析器后,您必须找到某种方式向系统建议哪些部分可以自动转换。 对于一般情况,您可以尝试向解析器/生成器脚本添加规则。 对于更具体的情况,我会在实际的类/属性/方法上使用自定义元数据,假设真正的 as3 解析器会正确解析这些。 现在
  • 如何编写好的单元测试? [关闭](How to write good Unit Tests? [closed])
    问题 关闭。 此问题不符合 Stack Overflow 准则。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 2年前关闭。 改进这个问题 任何人都可以推荐书籍或材料来学习单元测试吗? 有些人认为没有单元测试的代码是遗留代码。 如今,测试驱动开发是一种轻松管理大型软件项目的方法。 我非常喜欢 C++,我在没有任何正规教育的情况下自学了它。 我以前从未研究过单元测试,所以感觉被冷落了。 我认为单元测试很重要,从长远来看会有帮助。 我将不胜感激有关此主题的任何帮助。 我的主要关注点是: 什么是单元测试? 它是应该分析的测试用例的完整列表吗? 因此,让我们说我有一个名为“复数”的类,其中包含一些方法(可以说找到共轭、重载赋值运算符和重载乘法运算符。此类类的典型测试用例应该是什么?是否有任何方法?用于选择测试用例? 是否有任何框架可以为我创建单元测试,或者我必须编写自己的测试类? 我在 Visual Studio 2008 中看到了“测试”选项,但从未让它工作。 单元测试的标准是什么? 是否应该对类中的每个函数进行单元测试? 对每个班级都进行单元测试有意义吗? 回答1 重要的一点(我一开始没有意识到)是单元测试是一种可以单独使用的测试技术,无需应用完整的测试驱动方法。 例如,您希望通过向问题区域添加单元测试来改进遗留应用程序
  • xsd.exe 生成的类的可为空值(Nullable value with xsd.exe generated class)
    问题 我一直在使用 xsd.exe 生成一个用于将 XML 反序列化的类。 我在源 xsd 中有不需要的十进制值: <xs:attribute name="Balance" type="xs:decimal" use="optional" /> xsd 生成的类生成以下代码: private decimal balanceField; [System.Xml.Serialization.XmlAttributeAttribute()] public decimal Balance { get { return this.balanceField; } set { this.balanceField = value; } } 我注意到它不可为空。 我如何将字段生成为可为空的,如下所示: private decimal? balanceField; [System.Xml.Serialization.XmlAttributeAttribute()] public decimal? Balance { get { return this.balanceField; } set { this.balanceField = value; } } 回答1 目前它可以正常工作。 我正在使用 xsd v2.0.50727.42 并且: <xs:element name="Port" type=
  • 如何在C#中以编程方式创建XSD文件?(How to create XSD file programmatically in C#?)
    问题 我有一个 xml 文件(我使用 XmlDocument 在 c# 中创建的),现在我必须在 C# 中以编程方式创建对应于它的 xsd 文件......我该怎么做? 我可以使用相同的类来创建xml文件吗? 还是有其他我应该使用的类(与xsd相关)? 回答1 如果您只想从 XML 文件生成 XSD 文件,则可以使用 Microsoft 的 XSD.EXE,它包含在 Visual Studio 中。 要使用它,请打开 Visual Studio 命令提示符。 然后输入xsd file.xml以生成该 XML 文件的模式。 您还可以使用该工具为 XML 输入生成类,只需传入/classes参数即可。 回答2 虽然 XML Schema 文件是一个 XML 文件,但它的某些事情可能会使“手动”完成它变得很麻烦; 有人可能会说为什么使用 DOM API 编写 XML 而不是使用由 XSD.exe 或 XSD2Code.exe 生成的 C# 类? 或推一下它...有点类似于有人说C#语句最终变成IL汇编; 为什么不写IL呢? 另一种选择是由 Schema Object Model API 提供的; 在 .NET 中,它是 System.Xml.Schema 命名空间。 看看在 MSDN 上找到的代码示例。 它会给你另一种方法的想法。 它提供了一个程序员友好的API来生成XSD
  • 将单元测试作为它正在测试的类的朋友有什么问题? [复制](What is wrong with making a unit test a friend of the class it is testing? [duplicate])
    问题 这个问题在这里已经有了答案: 如何测试私有函数或具有私有方法、字段或内部类的类? (55 个回答) 3年前关闭。 在 C++ 中,我经常将单元测试类作为我正在测试的类的朋友。 我这样做是因为我有时觉得需要为私有方法编写单元测试,或者我可能想要访问某个私有成员,以便我可以更轻松地设置对象的状态,以便我可以测试它。 对我来说,这有助于保留封装和抽象,因为我没有修改类的公共或受保护的接口。 如果我购买第三方库,我不希望它的公共接口被一堆我不需要知道的公共方法污染,因为供应商想要进行单元测试! 我也不想担心一堆受保护的成员,如果我从一个类继承,我不需要知道这些成员。 这就是为什么我说它保留了抽象和封装。 在我的新工作中,他们甚至不赞成在单元测试中使用友元类。 他们说因为类不应该“知道”任何有关测试的信息,并且您不希望类与其测试紧密耦合。 有人可以向我解释更多这些原因,以便我更好地理解吗? 我只是不明白为什么使用朋友进行单元测试是不好的。 回答1 理想情况下,您根本不需要对私有方法进行单元测试。 你的类的消费者应该关心的只是公共接口,所以这就是你应该测试的。 如果一个私有方法有一个错误,它应该被一个单元测试捕获,该单元测试调用类上的一些公共方法,最终调用有问题的私有方法。 如果一个错误设法溜走了,这表明您的测试用例没有完全反映您希望您的类实现的契约。
  • 有没有办法让 xsd.exe 生成具有“内部”作用域的类?(Is there a way to get xsd.exe to generate classes with “internal” scope?)
    问题 我有一个包含一些 XSD 生成类的 DLL。 不幸的是,XSD.exe 将这些类公开,从而导致“缺少公开可见类型或成员 XYZ 的 XML 注释”警告。 另外,我不想从我的 DLL 中公开这些类。 除了手动编辑生成的 .cs 之外,有没有办法使这些类成为内部类? 回答1 这是一个非常简短的答案,可以扩展为一本书。 不,xsd.exe 不能做你想做的事。 但是,您可以使用本文中描述的技术访问 XmlCodeExporter 类,该类是从 XML 架构生成代码的框架的一部分。 完成此操作后,您将在内存中拥有一份用于生成代码的 CodeDOM 副本。 您可以遍历命名空间中的所有类并将它们设置为内部。 消除这一警告所需的努力可能超出您的预期。 消除警告的另一种方法是在关闭 XML 文档的程序集中生成代码(毕竟谁需要生成代码的文档?)
  • 您如何在重要的应用程序中执行 TDD? [关闭](How do you do TDD in a non-trivial application? [closed])
    问题 关闭。 这个问题是基于意见的。 它目前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑这篇文章用事实和引文来回答问题。 3年前关闭。 改进这个问题 我已经阅读了许多关于 TDD 主题的书籍和网站,它们都很有意义,尤其是 Kent Beck 的书。 然而,当我尝试自己做 TDD 时,我发现自己盯着键盘想知道如何开始。 有你使用的过程吗? 你的思考过程是怎样的? 你如何确定你的第一次测试? 大多数关于该主题的书籍都很好地描述了 TDD 是什么,但没有描述如何在现实世界的非平凡应用程序中实践TDD。 你是怎么做TDD的? 回答1 我曾经有同样的问题。 我过去常常通过启动一个窗口设计器来为我想要实现的第一个功能创建 UI 来开始大多数开发。 由于 UI 是最难测试的事情之一,因此这种工作方式并不能很好地转化为 TDD。 我发现 Presenter First 上的原子对象论文非常有帮助。 我仍然首先设想我想要实现的用户操作(如果你有用例,这是一个很好的开始方式),然后使用 MVP 或 MVC-ish 模型我开始为第一个屏幕的演示者编写测试。 通过模拟视图直到演示者工作,我可以通过这种方式快速开始。 http://www.atomicobject.com/pages/Presenter+First 这里有关于以这种方式工作的更多信息。