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

本文关键字:类型 对象 转换 运行时 | 更新日期: 2023-09-27 18:27:36

我有一个类似的语句:MyClass myClass = report.DataSource as MyClass

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

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

(我希望我已经解释清楚了。我的大脑现在很模糊!)

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

不幸的是,它不仅仅是"不同命名空间中的同一个类"。。。基本上,你有两节课。由于是自动生成的代码,它们是完全不同的类。

就.Net运行时而言,它们可能与"int"answers"string"一样不同。他们甚至可能来自不同的集会。

我也遇到过类似的问题——在这一点上,你能做的最简单的事情可能是制作你自己的通用转换器方法,它将从一个类型中读取公共属性,并在另一个类型上填充它们。

这样做是因为您承诺这两个类看起来完全相同:)

如果我正确理解您的问题,那么您有两个引用同一服务的项目(将服务引用添加到同一端点)。该服务返回一个DataContract对象。其中一个项目引用另一个项目,并使用另一个生成的服务DataContract代理。

正如其他人所指出的,默认情况下,为DataContract生成的代理类型将代表两种不同的、不兼容的类型。

但是,如果您能够在客户端和服务器上都使用.NET,则可以在其自己的程序集中定义DataContract类型,该程序集由其他三个项目(服务库和两个客户端项目)引用。无论如何,这样做通常是很好的做法。

然后,您可以配置客户端代理的生成(添加服务参考->高级),以重用公共程序集中的类型。

现在,两个客户端项目共享的DataContract将只有一种类型。

从本质上讲,您想要的是所谓的"duck-type"。您可以使用Castle DynamicProxy执行此操作,并在此处找到一个很好的示例。

我不确定我是否清楚地理解了您的问题,但现在是

不要将这些类的using语句放在类文件的顶部,这样您将始终使用完整的名称空间引用它们。

之后,就我所理解的而言,这很容易

MyClass myClass = report.DataSource as MyClass
if(myClass==null)
  //do the second conversion

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

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

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

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

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

试图实现我自己的类型转换器,或者使用像automapper这样的外部工具来解决一个一次性问题,工作量太大了。我选择将所有数据从一种类型复制到另一种类型。我使用javascriptserializer只获取没有名称空间的模式和数据。在5行代码中表现出色。