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;
}
}
}