using System; using System.Linq.Expressions; using System.Reflection; using Umbraco.Core.Models.PublishedContent; using Umbraco.Web; namespace Umbraco.ModelsBuilder { /// /// Provides extension methods to models. /// public static class PublishedElementExtensions { /// /// Gets the value of a property. /// public static TValue Value(this TModel model, Expression> property, string culture = ".", string segment = ".") where TModel : IPublishedElement { var alias = GetAlias(model, property); return model.Value(alias, culture, segment); } private static string GetAlias(TModel model, Expression> property) { if (property.NodeType != ExpressionType.Lambda) throw new ArgumentException("Not a proper lambda expression (lambda).", nameof(property)); var lambda = (LambdaExpression) property; var lambdaBody = lambda.Body; if (lambdaBody.NodeType != ExpressionType.MemberAccess) throw new ArgumentException("Not a proper lambda expression (body).", nameof(property)); var memberExpression = (MemberExpression) lambdaBody; if (memberExpression.Expression.NodeType != ExpressionType.Parameter) throw new ArgumentException("Not a proper lambda expression (member).", nameof(property)); var member = memberExpression.Member; var attribute = member.GetCustomAttribute(); if (attribute == null) throw new InvalidOperationException("Property is not marked with ImplementPropertyType attribute."); return attribute.Alias; } } }