将编译的类型强制转换为当前命名空间类型

本文关键字:类型 命名空间 转换 编译 | 更新日期: 2023-09-27 18:25:05

我目前正在C#/Silverlight中构建一个模拟器。因为我们正在模拟一个特定的软件域,所以我们有域级别的类(Cube、CubeSet、BaseApp等),必须在模拟器的范围内实现。此外,这些域级类必须对应用程序开发人员可用,因为它们对将要模拟的应用程序是可访问的。

所以我们有一个.dll,它只是域级类的编译,然后在模拟器实现本身中,我们有一组相同的域级类。

目标是动态实例化应用程序对象(这是可行的),然后调用该应用程序的一系列方法来执行仿真。然而,在调用其中一个方法时,我们必须传入一个在模拟器实现中实例化的域级对象。我们必须在动态实例化的应用程序上调用AssociateCubes(它接受一个CubeSet参数)。当我尝试动态地这样做时,我会得到一个InvalidCastException,它(很有趣)说"CubeSet"对象不能被强制转换为"CubeSt"对象。用于动态访问应用程序的代码示例是:

Object o = Activator.CreateInstance(appType);
MethodInfo AssocCubes = o.GetType().GetMethod("AssociateCubes");
AssocCubes.Invoke(o, new object[] { Cubes });

其中Cubes在模拟器中属于CubeSet类型,appType由用户给定。

是否有任何方法可以强制在两者之间建立某种链接,以便编译器识别出实际上是同一个类,或者这两个类是完全不同的,不能以允许将一种类型的对象强制转换为另一种类型。

我考虑过的一个解决方案是简单地定义一个方法,将一个对象的内容手动复制到模拟器中的实例,但其中的问题是,应用程序开发人员可以为应用程序类定义自己的方法,以用作辅助方法。

我可能没有完全解释所有内容,所以我可以提供任何可能有助于揭示潜在解决方案的澄清。

将编译的类型强制转换为当前命名空间类型

InvalidCastException只显示完整类名的最后一部分以方便使用,但类型是根据完整标识进行比较的:全名(包括命名空间)和它来自的程序集(如果签名,可能具有强名称)。

考虑使用单元测试框架来"模拟"对象。或者至少阅读一下这样的框架是如何包装类的。

真正的解决方案是使用可测试的类层次结构。经常使用concreate类的实例化接口有助于解决此类if问题。

我不想否定之前给出的答案,但我已经找到了一个解决方案,正如我在评论中所描述的那样。

相反,我所做的是从模拟器项目中提取域层,并将其单独编译为DLL。现在,DLL在模拟器和单独的应用程序中被引用,所以当动态加载类型时,它们毕竟被认为是相同的类型。