C# 'is' 关键字提供了意外的结果

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

我的 asp.net mvc 项目出现问题,显示为此错误:

The model item passed into the dictionary is of type 'CMS.Web.Models.Modules.RawHtmlDisplayViewModel', but this dictionary requires a model item of type '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# 的“is”关键字会以这种方式失败?尝试用谷歌搜索"is"并没有多大帮助...

我们在项目中做的一些非常规的事情值得一提:

  • 模块 View 作为资源文件包含在 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 会在那里结束吗?

最佳答案

在花了很多时间研究我的程序集加载代码并试图找出为什么会加载重复程序集之后,我搜索了我的“Assembly.Load”解决方案,并在其他人编写的名为 AssemblyResourceProvider 从程序集中加载 View 文件:

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

在我拍完脸后,我用这个代替了它:

_cmsWebAssembly = typeof(AssemblyResourceProvider).Assembly

这解决了问题。

关于C# 'is' 关键字提供了意外的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25285782/

相关文章:

c# - 初始化 KeyValuePair 数组

c# - HttpWebRequest 响应内容的编码问题

ASP.Net Form 的字段仅在客户的环境中为空

asp.net-mvc - 如何删除 mvc 中带有选定选项标签的下拉菜单的模型状态错误?

jquery - 如果模型对话框已打开,则无法下载文件

c# - 如果不存在,如何创建 c# app.config 文件?

c# - C#.NET 中的 SQLite3

c# - Entity Framework 可查询异步

jquery - 在jquery中更改类名

asp.net-mvc - 未找到类型 'System.Data.Entity.Infrastructure.SqlConnectionFactory' 的构造函数