Возникли проблемы при получении пользовательских атрибутов

Я пытаюсь получить все атрибуты каждого свойства внутри класса, однако мне сложно понять, как это сделать. Я пробовал несколько разных способов, но чувствую, что поступаю неправильно. Вот пример класса и его свойства с атрибутами. Любое понимание будет высоко ценится!

[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 ответ

Решение

ИСТОЧНИК ПРОБЛЕМЫ:

LINQ Cast<T> Метод пытается привести каждый из атрибутов в IEnumerable для данного типа. И это не удается, потому что ваш метод имеет другой атрибут IndexField тип. Вот почему вы получаете InvalidCastException при выполнении запроса.

РЕШЕНИЕ:

Чтобы решить проблему, нужно использовать 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();

PS: Также вы можете прочитать, когда использовать Cast() и Oftype() в Linq, чтобы прояснить проблему и улучшить понимание LINQ.

Другие вопросы по тегам