c# & # 39;如果# 39;提供意外结果的关键字
本文关键字:结果 关键字 意外 如果 | 更新日期: 2023-09-27 18:18:00
我有一个问题,我的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为假,但接口变量确实包含CMS.Web.Models.Modules.IModuleDisplayViewModel
:
var isModuleDisplayData = viewModel is IModuleDisplayViewModel;
var interfaces = viewModel.GetType().GetInterfaces();
所有这些代码都在另一个项目引用的单独CMS项目中。在这个项目中,我有一个CustomModuleDisplayViewModel
,也继承自IModuleDisplayViewModel
,并以同样的方式使用。这确实工作得很好,上面代码中的isModuleDisplayData
检查返回true。
有很多比我能包括在这里,所以我想我的问题是在什么情况下c#的"是"关键字会以这种方式失败?试着用谷歌搜索"is"并没有被证明是很有帮助的…
我们在项目中做的一些稍微不寻常的事情值得一提:
- 模块视图作为资源文件包含在CMS项目
- 我们强制加载bin文件夹中尚未加载的所有程序集,以便进行类型扫描。
谢谢大家这么快的回复!名称空间是完全相同的,所以我认为如果在同一个名称空间内声明两次,就会导致编译问题。在任何情况下,根据你的评论,我认为动态加载程序集一定是麻烦,并运行了更多的测试:
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var cmsAssembly = assemblies.Where(a => a.FullName.Contains("CMS"));
结果是CMS程序集加载了两次,这导致了这个问题。一个来自bin文件夹,另一个位于"临时ASP"中。网络文件"。看看这个问题,这似乎是动态编译网站代码的结果。我需要在我的程序集加载中考虑到这一点,但是有人知道为什么CMS dll会在那里结束吗?
在花费大量时间调查我的程序集加载代码并试图找出为什么会加载重复的程序集之后,我搜索了我的解决方案"assembly"。然后在别人写的一个叫做AssemblyResourceProvider
的类中发现了这个小妙处,这个类从程序集加载视图文件:
_cmsWebAssembly = System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes(Path.Combine(HttpRuntime.BinDirectory, "CMS.Web.dll")));
在我捂完脸之后,我把它换成了这个:
_cmsWebAssembly = typeof(AssemblyResourceProvider).Assembly