我的声明如下:MyClass myClass = report.DataSource as MyClass
在运行时期间,DataSource的类型是MyClass,但它与当前运行的项目位于不同的命名空间中。那是因为两个项目正在从同一个服务引用中创建相同的类。 DataSource指向一个命名空间,MyClass强制转换来自不同的namesapce。 (解释这是怎么发生的很复杂)
在运行时,如何使用report.DataSource.GetType()返回的类型(从另一个命名空间返回MyClass)并将其用作类型转换而不是我不想要的命名空间中的“MyClass” ?
(我希望我已经清楚地解释了。我的大脑现在有雾了!)
答案 0 :(得分:2)
不幸的是,它不仅仅是“不同命名空间中的同一个类”......基本上,你有2个类。由于自动生成的代码,它们是完全不同的类。
就.Net运行时而言,它们可能与“int”和“string”不同。他们甚至可能来自不同的集会。
我也有类似的问题 - 在这一点上,你可以做的最简单的事情就是制作你自己的通用转换器方法,它将从一种类型读取公共属性,并在另一种类型上填充它们
这可以做到,因为你 PROMISE 这两个类看起来完全相同:)
答案 1 :(得分:1)
如果我正确理解您的问题,您有两个引用相同服务的项目(向同一端点添加服务引用)。该服务返回一个DataContract对象。您还有一个引用另一个的项目,并使用另一个项目为服务的DataContract生成的代理。
正如其他人所指出的那样,默认情况下,DataContract生成的代理类型将代表两种截然不同的不兼容类型。
但是,如果您能够在客户端和服务器上使用.NET,则可以在其自己的程序集中定义DataContract类型,该类型由所有其他三个项目(服务库和两个客户端项目)引用。无论如何,这通常是一种很好的做法。
然后,您可以配置客户端代理的生成(添加服务引用 - >高级)以重用公共程序集中的类型。
现在,两个客户端项目共享的DataContract只有一种类型。
答案 2 :(得分:0)
基本上你想要的是“鸭子打字”。您可以使用Castle DynamicProxy执行此操作,并找到一个很好的示例here。
答案 3 :(得分:0)
我不确定我是否清楚地理解了你的问题,但在这里
不要将这些类的using
语句放在类文件的顶部 - 这样您就可以使用完整的命名空间来引用它们。
之后,据我所知,这很容易
MyClass myClass = report.DataSource as MyClass
if(myClass==null)
//do the second conversion
如果命名空间完全(或部分)发生冲突,请使用两个
中的一个global::
关键字extern alias
在具有MyClass 如果要将一个类转换为另一个类,请实现自定义转换器。
答案 4 :(得分:0)
它可能不适合您的目的,但为了完整,我提到了您可以使用的编译时选项:接口。
如果在程序集中创建 CAN 在编译时共享的接口,则可以随时转换为该接口。
答案 5 :(得分:0)
尝试实现我自己的类型转换器或使用像automapper这样的外部工具一次性问题是太多的工作。我选择将所有数据从一种类型复制到另一种类型。我使用javascriptserializer来获取没有名称空间的模式和数据。在5行代码中精心工作。