转换时出错 class 'Unable to cast'
Error when casting class 'Unable to cast'
我正在尝试转换继承基础 class 但返回 null 的实体 class。
下面是代码片段class
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 属性。
您不能根据 class 的基础自动施放 class。你可以反过来做。
示例:
你有:
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 对象转换为调用项,当您尝试访问 Prop5 和 Prop6 时代码会中断,因为它们不在 CallItemBase class.
但是,如果您有一个 CallItemBase 列表并尝试将其 itens 转换为 CallItem,它会起作用,因为 CallItem 具有 CallItemBase 所具有的所有属性,加上它自己的属性。
关键字"as" return 如果类型不正确则为null。
您可以将继承的 class 转换为基数 class,但不能将基数 class 转换为继承的 class.
这个问题有很多答案。
例如 :
Convert base class to derived class
一个解决方案是使用 CallItemBase 的集合并像这样
var item = i as CallItemBase;
或者您可以将您的集合转换为 CallItem 集合。
这是玻璃映射器 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 };
}
并且在 class 中您将调用项定义为子项,您应该添加属性 InferType=true
:
public class YourCollectionClass
{
[SitecoreChildren(InferType = true)]
public virtual IEnumerable<CallItemBase> CallItems{ get; set; }
}
我正在尝试转换继承基础 class 但返回 null 的实体 class。
下面是代码片段class
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 属性。
您不能根据 class 的基础自动施放 class。你可以反过来做。
示例:
你有:
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 对象转换为调用项,当您尝试访问 Prop5 和 Prop6 时代码会中断,因为它们不在 CallItemBase class.
但是,如果您有一个 CallItemBase 列表并尝试将其 itens 转换为 CallItem,它会起作用,因为 CallItem 具有 CallItemBase 所具有的所有属性,加上它自己的属性。
关键字"as" return 如果类型不正确则为null。 您可以将继承的 class 转换为基数 class,但不能将基数 class 转换为继承的 class.
这个问题有很多答案。 例如 : Convert base class to derived class
一个解决方案是使用 CallItemBase 的集合并像这样
var item = i as CallItemBase;
或者您可以将您的集合转换为 CallItem 集合。
这是玻璃映射器 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 };
}
并且在 class 中您将调用项定义为子项,您应该添加属性 InferType=true
:
public class YourCollectionClass
{
[SitecoreChildren(InferType = true)]
public virtual IEnumerable<CallItemBase> CallItems{ get; set; }
}