Возникли проблемы при получении пользовательских атрибутов
Я пытаюсь получить все атрибуты каждого свойства внутри класса, однако мне сложно понять, как это сделать. Я пробовал несколько разных способов, но чувствую, что поступаю неправильно. Вот пример класса и его свойства с атрибутами. Любое понимание будет высоко ценится!
[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.