有人知道为什么BlockData类没有直接实现IContent吗? 我知道在从数据库中检索BlockData期间,由Castle创建的代理实现了IContent。
如果StackOverflow不适合此类问题,请移动它。
答案 0 :(得分:5)
EPiServer的JohanBjörnfot解释了一些细节in this post。
摘录:
“在以前版本的CMS中,页面(PageData)是内容存储库(传统上是DataFactory)处理的唯一内容类型。在CMS7中,这已经改变,所以现在内容存储库(IContentRepository)处理IContent实例。这意味着.NET类型可以从内容存储库中保存/加载的要求是它实现了接口EPiServer.Core.IContent。
在内置于CMS中的IContent有一些实现,如PageData和ContentFolder(用于对共享块实例进行分组),也可以注册自定义IContent实现。如果你看看BlockData,你会注意到它没有实现IContent,然后如何处理共享块实例?
答案是在运行时创建共享块实例(例如,通过调用IContentRepository.GetDefault,其中T是继承自BlockData的类型),CMS将创建一个继承T的新.NET类型技术名为mixin,其中新生成的子类将实现一些额外的接口(包括IContent)。“
答案 1 :(得分:1)
BlockData“确实实现了IContent”,只需执行:
var myContent = (IContent)myBlock;
但是,如果您有任何机会处理Block 本身 属性(而非ContentReference),那么该转换会抛出异常。
100%的情况都是如此(......使用Math.Round)。