C#'是'关键字提供意外结果

时间:2014-08-13 12:09:17

标签: c# asp.net asp.net-mvc types

我的asp.net mvc项目出现问题,因为这个错误出现了问题:

  

传递到字典中的模型项是类型的   'CMS.Web.Models.Modules.RawHtmlDisplayViewModel',但是这本字典   需要类型的模型项   'CMS.Web.Models.Modules.RawHtmlDisplayViewModel'。

设置相当复杂,但我已将问题与is关键字隔离,从而产生意外结果。 CMS.Web.Models.Modules.RawHtmlDisplayViewModel继承自CMS.Web.Models.Modules.IModuleDisplayViewModel但是对于以下测试代码,isModuleDisplayData为false,但interfaces变量确实包含CMS.Web.Models.Modules.IModuleDisplayViewModel

var isModuleDisplayData = viewModel is IModuleDisplayViewModel;
var interfaces = viewModel.GetType().GetInterfaces();

所有这些代码都在另一个项目引用的单独CMS项目中。在这个项目中,我有CustomModuleDisplayViewModel,它也继承自IModuleDisplayViewModel并以相同的方式使用。这确实工作正常,上面代码中的isModuleDisplayData检查返回true。

还有很多事情比我能够包含在这里还要多,所以我想我的问题是在什么情况下C#''关键字会以这种方式失败?试图谷歌'是'并没有证明是非常有帮助的......

我们在项目中做的一些有点不同寻常的事情值得一提:

  • 模块视图作为资源文件包含在CMS项目中
  • 我们强制加载bin文件夹中尚未加载的所有程序集以进行类型扫描。

更新:

谢谢大家这么快回复!名称空间完全相同,所以我假设如果它们在同一名称空间中被声明两次会导致编译问题。在任何情况下根据你的评论,我认为装配的动态加载必须是麻烦,并进行了一些测试:

var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var cmsAssembly = assemblies.Where(a => a.FullName.Contains("CMS"));

事实证明CMS程序集加载了两次导致问题。一个来自bin文件夹,另一个位于“Temporary ASP.NET Files”中。看this question这似乎是网站代码动态编译的结果。我需要在装配加载时以某种方式解释这个问题,但有谁知道为什么CMS dll会在那里结束?

1 个答案:

答案 0 :(得分:1)

花了很多时间调查我的程序集加载代码并试图找出为什么会加载重复的程序集我搜索了我的解决方案'Assembly.Load'并在其他人编写的类中找到了这个小美女{ {1}}加载程序集中的视图文件:

AssemblyResourceProvider

在我完成一个facepalm时刻之后,我用它替换了它:

_cmsWebAssembly = System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes(Path.Combine(HttpRuntime.BinDirectory, "CMS.Web.dll")));

这解决了这个问题。