如何在运行时知道类型时将对象强制转换为类型?

时间:2013-08-13 01:07:37

标签: c# .net wcf

我的声明如下:MyClass myClass = report.DataSource as MyClass

在运行时期间,DataSource的类型是MyClass,但它与当前运行的项目位于不同的命名空间中。那是因为两个项目正在从同一个服务引用中创建相同的类。 DataSource指向一个命名空间,MyClass强制转换来自不同的namesapce。 (解释这是怎么发生的很复杂)

在运行时,如何使用report.DataSource.GetType()返回的类型(从另一个命名空间返回MyClass)并将其用作类型转换而不是我不想要的命名空间中的“MyClass” ?

(我希望我已经清楚地解释了。我的大脑现在有雾了!)

6 个答案:

答案 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

如果命名空间完全(或部分)发生冲突,请使用两个

中的一个
    引用课程时
  1. global::关键字
  2. extern alias在具有MyClass
  3. 的一个或两个程序集中

    如果要将一个类转换为另一个类,请实现自定义转换器。

答案 4 :(得分:0)

它可能不适合您的目的,但为了完整,我提到了您可以使用的编译时选项:接口。

如果在程序集中创建 CAN 在编译时共享的接口,则可以随时转换为该接口。

答案 5 :(得分:0)

尝试实现我自己的类型转换器或使用像automapper这样的外部工具一次性问题是太多的工作。我选择将所有数据从一种类型复制到另一种类型。我使用javascriptserializer来获取没有名称空间的模式和数据。在5行代码中精心工作。

相关问题