我试图转换继承基类但返回null的实体类。
以下是代码段类
public class CallItem : CallItemBase {
[SitecoreField("TitleLink")]
public virtual Link TitleLink { get; set; }
SitecoreField("Image")]
public virtual Image Image { get; set; }
}
Razor视图
@foreach (var i in Model.CallItems)
{
var item = i as CallItem; //Its null even though i is not null
}
CallItems是CallItemBase
的集合忘了提到CallItem有glassmapper属性。
答案 0 :(得分:1)
您无法基于其基类自动转换类。你可以反过来做。
示例:
你有:public class CallItemBase
{
public int Prop1 {get;set;}
public int Prop2 {get;set;}
public int Prop3 {get;set;}
public int Prop4 {get;set;}
}
public class CallItem : CallItemBase
{
public int Prop5 {get;set;}
public int Prop6 {get;set;}
}
如果将CallItemBase对象强制转换为call item,则在尝试访问Prop5和Prop6时代码会中断,因为它们不在CallItemBase类中。
但是,如果您有一个CallItemBase列表并尝试将其itens转换为CallItem,那么它将起作用,因为CallItem具有CallItemBase具有的所有属性,以及它自己的属性。
答案 1 :(得分:1)
如果类型不正确,关键字“as”将返回null。 您可以将继承的类转换为基类,但不能转换为继承类的基类。
这个问题有很多答案。 例如 : Convert base class to derived class
一种解决方案是使用CallItemBase的集合并像这样执行
var item = i as CallItemBase;
或者您可以将您的收藏转换为CallItem收藏。
答案 2 :(得分:1)
这是玻璃映射器InferType,要使其工作,您需要注册模型程序集,为此,请转到App_Start/GlassMapperScCustom.cs
并在GlassLoaders方法中添加程序集:
public static IConfigurationLoader[] GlassLoaders(){
/* USE THIS AREA TO ADD FLUENT CONFIGURATION LOADERS
*
* If you are using Attribute Configuration or automapping/on-demand mapping you don't need to do anything!
*
*/
var attributes = new SitecoreAttributeConfigurationLoader("YourAssembly");
return new IConfigurationLoader[]{ attributes };
}
在您将callitems定义为子项的类中,您应该添加属性InferType=true
:
public class YourCollectionClass
{
[SitecoreChildren(InferType = true)]
public virtual IEnumerable<CallItemBase> CallItems{ get; set; }
}