2012-04-18 108 views
1

在我的应用程序的一部分中,我使用从xsd方案生成的类型 - 我有2个版本的方案2008和2009 - 我使用的类型是DatumType - 在每种方案中,此类型包含相同属性 - 它们是确切的,除了命名空间。 有没有办法如何将DatumType(2008)转换为DatumType(2009),这样我只能在一种类型的应用程序中工作,而不是两种?类型转换为具有相同属性的另一个

我正在使用c#和赢取窗体,谢谢!

+0

您可以让这两种类型实现与所有这些列的接口。扼杀这个,或者通过另一个类型改变一种类型的所有实例,你可以做的事情并不多。 – Servy 2012-04-18 21:49:56

+0

是的,但这不仅是我需要解决这个问题的发生 - 我有另一种类型的相同的问题,并为每种类型做接口将是很多工作 – 2012-04-18 21:52:19

+0

是的,这样做会很多工作。这并不会改变那些确实是您拥有的唯一两种选择。 – Servy 2012-04-18 21:53:33

回答

3

不,没有办法将一个转换到另一个,因为这是两个不相关的类型,据编译器知道。

如果目标类型的字段是可赋值的,则可以编写一个使用反射来复制字段的简短方法。

您还可以构建将源类型的对象保存为XML的代码,并将该XML读入目标类型的对象中。这稍微更脆弱,因为它依赖于相同字段的存在,因为它们以相同的方式转换为XML。

+0

当我将这些类型的数据保存到xml中时,只是在读取xml中更改名称空间没有问题 - 只是它们不同 - 所有内容都是相同的 - 但我试图冒用它 – 2012-04-18 22:04:04

+0

@MartinCh我建议基于XML因为它可能更容易编码。基于反射的代码很可能要快得多,但开发起来要复杂一些。 – dasblinkenlight 2012-04-18 22:06:54

0

在我看来,最简单的做法是构建一种将一种类型转换为另一种类型的小方法(因为它们都共享属性),或者如果您有权访问源代码,请实现一个接口你可以使用这两个类作为该接口。换句话说,如果我们有两个继承接口A(包含我们感兴趣的所有属性)的类B和C,那么我们可以将这两个类的任何对象作为一个A进行类型转换。

+0

我理解接口,但这不是我喜欢使用的方式,我在谈论一些linq方法,它会遍历每个属性并将其复制到第二种类型的实例中 – 2012-04-18 21:56:39

0

您可以使用简单的XSLT预处理您的XML文件,以纠正命名空间差异。

Identity的第2部分解释了如何去做。基本上,变换具有匹配元素的模板,并为每个匹配元素提供输出。诀窍是拥有一个特定的模板来匹配Datum元素并对其进行转换,以及一个匹配所有类型元素并且简单地复制它们的通用转换。

如果您没有使用XSLT的经验,请不要害怕。学习起来比你想象的要容易。您可以使用像XSLT tutorial这样的教程,这将使您了解“身份”的解释。可以使用XslCompiledTransform Class来应用变换。

你可以use Visual Studio to test and debug your XSLT文件。

相关问题