无法获取自定义属性

时间:2014-08-07 17:34:39

标签: c# attributes sitecore glass-mapper

我正在尝试获取每个属性的所有属性,但是我无法弄清楚如何这样做。我尝试了几种不同的方式,但我觉得我错了。这是一个类及其属性属性的示例。任何见解都会非常感激!

[SitecoreType(TemplateId= "{60E73011-0E01-4C13-A9A4-FAF8FF607930}", AutoMap= true)]
public class CalUserResults : BaseItem
{
    [IndexField("calcpa_user_name")]
    [SitecoreField("CalCPA User Name")]
    public virtual string CalUserName{ get; set; }
}

具体来说,我正在尝试获取IndexField和SitecoreField。谢谢!

编辑我尝试过的东西......

 CalUserResults kf = new CalUserResults();

 Glass.Mapper.Sc.Configuration.Attributes.SitecoreFieldAttribute attribute = kf.
     GetType().
     GetMethod("CalUserName").
     GetCustomAttributes(false).
     Cast<Glass.Mapper.Sc.Configuration.Attributes.SitecoreFieldAttribute>().
     SingleOrDefault();

尝试使用FieldInfo

1 个答案:

答案 0 :(得分:1)

问题来源:

LINQ Cast<T>方法尝试将IEnumerable中的每个属性强制转换为给定类型。它失败了,因为你的方法有另一个IndexField类型的属性。这就是你在执行查询时获得InvalidCastException的原因。

<强> SOLUTION:

解决问题的方法是使用LINQ OfType<T>方法。它根据强制转换操作的成功过滤IEnumerable

 Glass.Mapper.Sc.Configuration.Attributes.SitecoreFieldAttribute attribute = kf. 
     GetType().  
     GetProperty("CalUserName").
     GetCustomAttributes(false). 
     OfType<Glass.Mapper.Sc.Configuration.Attributes.SitecoreFieldAttribute>(). 
     SingleOrDefault();

P.S。:此外,您可能需要阅读When to use Cast() and Oftype() in Linq来澄清问题并提高对LINQ的理解。