如何从glassmapper映射的对象属性中获取sitecore字段?

时间:2014-09-02 14:40:32

标签: c# sitecore glass-mapper

我们正在使用Glass Mapper和Sitecore,我们的模型可以获取sitecore字段的值。但是我希望通过使用模型轻松获取sitecore字段(sitecore字段类型),而无需将任何字符串(当使用GetProperty()时,需要属性名称字符串)硬编码到方法中。

所以我写了这个东西来实现这一点,但是我不满意使用它时需要传递的两种类型,因为当你有一个很长的模型标识符时看起来很糟糕。

   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()一样得到它。但是我无法弄清楚如何从那里进行反思。因为这可以是任何类型的扩展。

谢谢!

2 个答案:

答案 0 :(得分:4)

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 否则,将忽略继承的属性。

答案 1 :(得分:0)

我不明白为什么我的问题被投票否决了。所以你认为它已经是完美的代码了吗?

在另一位高级开发人员的帮助下,我今天对其进行了改进,因此它不再需要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字段的人。