Как я могу получить поле sitecore из свойства объекта, сопоставленного с помощью GlassMapper?

Мы используем Glass Mapper с Sitecore, с нашими моделями мы можем получить значения полей sitecore. Но я хочу легко получить поля sitecore (тип поля sitecore), используя модель без жесткого кодирования каких-либо строк (при использовании GetProperty() вам нужна строка имени свойства) в методе.

Поэтому я написал эту вещь, чтобы добиться этого, однако я не доволен тем, что при ее использовании необходимо передать 2 типа, поскольку это выглядит ужасно, когда у вас длинный идентификатор модели.

   public static string SitecoreFieldName<T, TU>(Expression<Func<TU>> expr)
    {
         var body = ((MemberExpression)expr.Body);
         var attribute = (typeof(T).GetProperty(body.Member.Name).GetCustomAttributes(typeof(SitecoreFieldAttribute), false)[0]) as SitecoreFieldAttribute;
         return attribute.FieldName;
    }

Самый идеальный способ - получить вот так Model.SomeProperty.SitecoreField(). Однако я не могу понять, как сделать рефекцию оттуда. Потому что это может быть расширением для любого типа.

Спасибо!


person zhanke    schedule 02.09.2014    source источник
comment
Я знаю, что должен проверить нулевой массив. так что игнорируйте это.   -  person zhanke    schedule 02.09.2014
comment
Так в чем твой вопрос? Выглядит довольно просто и универсально для меня ..   -  person Ruud van Falier    schedule 03.09.2014
comment
Вопрос в том, чтобы улучшить его больше. В этом случае вам нужно передать 2 типа, чтобы заставить его работать, что не очень хорошо выглядит на странице aspx, когда вы используете его в контексте привязки данных.   -  person zhanke    schedule 03.09.2014


Ответы (2)


public static string SitecoreFieldName<TModel>(Expression<Func<TModel, object>> field)
{
    var body = field.Body as MemberExpression;

    if (body == null)
    {
        return null;
    }

    var attribute = typeof(TModel).GetProperty(body.Member.Name)
        .GetCustomAttributes(typeof(SitecoreFieldAttribute), true)
        .FirstOrDefault() as SitecoreFieldAttribute;

    return attribute != null
        ? attribute.FieldName
        : null;
}

Обратите внимание, что я поставил inherit=true при вызове метода GetCustomAttributes.
В противном случае унаследованные атрибуты игнорируются.

person Ruud van Falier    schedule 03.09.2014
comment
Извините, я пока не могу проголосовать, но спасибо! это именно то, что я искал. - person zhanke; 03.09.2014

Я не понимаю, почему за мой вопрос проголосовали. Итак, вы думаете, что это уже идеальный код?

С помощью другого старшего разработчика я улучшил его сегодня, так что ему больше не нужны 2 типа и намного понятнее синтаксис использования:

public static Field GetSitecoreField<T>(T model, Expression<Func<T, object>> expression) where T : ModelBase
    {
        var body = ((MemberExpression)expression.Body);
        var attributes = typeof(T).GetProperty(body.Member.Name).GetCustomAttributes(typeof(SitecoreFieldAttribute), false);
        if (attributes.Any())
        {
            var attribute = attributes[0] as SitecoreFieldAttribute;
            if (attribute != null)
            {
                return model.Item.Fields[attribute.FieldName];
            }
        }
        return null;
    }

и я могу просто вызвать это, сделав это:

GetSitecoreField(Container.Model<SomeModel>(), x => x.anyField)

Надеюсь, это поможет всем, кто использует Glass Mapper с Sitecore и хочет получить текущее поле sitecore из свойства модели.

person zhanke    schedule 03.09.2014