Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将编译类型强制转换为当前命名空间类型_C#_Silverlight_Oop_Design Patterns_Casting - Fatal编程技术网

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

C# 将编译类型强制转换为当前命名空间类型,c#,silverlight,oop,design-patterns,casting,C#,Silverlight,Oop,Design Patterns,Casting,我目前正在用C#/Silverlight构建一个模拟器。因为我们正在模拟一个特定的软件领域,所以我们有领域级的类(Cube、CubeSet、BaseApp等),我们必须在模拟器的范围内实现这些类。此外,这些域级类必须可供应用程序开发人员使用,因为它们可供将被模拟的应用程序访问 因此,我们有一个.dll,它只是一个域级类的编译,然后在仿真器实现本身中,我们有一个相同域级类的包 目标是动态实例化应用程序对象,这是可行的,然后调用该应用程序的一系列方法来执行仿真。然而,在调用其中一个方法时,我们必须传

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

因此,我们有一个.dll,它只是一个域级类的编译,然后在仿真器实现本身中,我们有一个相同域级类的包

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

Object o = Activator.CreateInstance(appType);
MethodInfo AssocCubes = o.GetType().GetMethod("AssociateCubes");
AssocCubes.Invoke(o, new object[] { Cubes });
其中,Cubes在emulator中为CubeSet类型,appType由用户给定

有没有办法在这两个类之间强制建立某种链接,以便编译器能够识别出实际上是同一个类,或者这两个类是完全不同的,并且不能以这样的方式关联,从而允许将一种类型的对象转换为另一种类型的对象

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


我可能没有完整地解释所有内容,因此我可以提供可能有助于公开潜在解决方案的任何澄清。

为方便起见,InvalidCastException仅显示完整类名的最后一部分,但类型会根据完整标识进行比较:完整名称(包括名称空间)和它来自的程序集(如果签名,可能具有强名称)

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


真正的解决方法是使用可测试的类层次结构。通常使用concreate类的接口有助于解决此类型的问题。

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

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


真正的解决方法是使用可测试的类层次结构。通常使用concreate类的接口有助于解决此类问题。

我不想忽视前面给出的答案,但我已经找到了一个解决方案,正如我在评论中所述


相反,我要做的是将域层从emulator项目中拉出来,并将其作为DLL单独编译。既然DLL在emulator和单独的应用程序中被引用,那么当动态加载类型时,它们毕竟被认为是相同的类型。

我不想忽略前面给出的答案,但我已经给出了答案我在我写的评论中描述了一个解决方案


我所做的是将域层从emulator项目中拉出来,并将其作为DLL单独编译。既然DLL在emulator和单独的应用程序中被引用,那么当动态加载类型时,它们毕竟被认为是相同的类型。

您看过单元测试框架(如Rhinomock)吗?它们支持类的这种替换。你看过单元测试框架(比如Rhinomock)吗?它们支持这样的类替换。我当然会研究一下。我现在想知道是否不可能从模拟器项目本身中排除域级别。然后模拟器将引用.dll,应用程序将引用.dll。这会将它们解析为具有相同的“完全标识”吗正如您所提到的?很高兴您找到了有效的解决方案-使用相同的类是非常好的方法。我肯定会对此进行研究。我现在想知道是否无法将域级别从仿真程序项目本身中排除。然后仿真程序将引用.dll,应用程序将引用.dll。这会解决问题吗正如您所提到的,拥有相同的“完整身份”吗?很高兴您找到了有效的解决方案-使用相同的类是非常好的方法。