5

I have a statement something like this: MyClass myClass = report.DataSource as MyClass

During runtime, the type of the DataSource is MyClass but it's in a different namespace than the current running project. That's because two projects are creating the same classes from the same service reference. DataSource points to one namespace and the MyClass cast is from a different namesapce. (it's complicated to explain how this occured)

During runtime, how do I use the type returned from report.DataSource.GetType() (returns MyClass from another namespace) and use it as type cast instead of 'MyClass' which is in the namespace which I don't want?

(I hope I've explained it clearly. My brain is foggy now!)

4

6 回答 6

2

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

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

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

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

于 2013-08-13T01:14:39.377 回答
1

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

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

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

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

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

于 2013-08-13T01:49:56.893 回答
0

It may not be suitable for your purpose, but to be complete, I mention the compile-time option available to you: Interfaces.

If you make an interface in an assembly that CAN be shared at compile time, you can cast to that interface at any time.

于 2013-08-13T01:53:46.817 回答
0

我不确定我是否清楚地理解了你的问题,但它就是这样

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

之后就很容易了,据我所知

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

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

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

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

于 2013-08-13T01:31:52.613 回答
0

本质上,您想要的称为“鸭子打字”。您可以使用Castle DynamicProxy执行此操作,并在此处找到一个很好的示例。

于 2013-08-13T01:23:09.130 回答
0

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

于 2013-08-13T17:55:49.630 回答