Files
Umbraco-CMS/src/Umbraco.Infrastructure/ModelsBuilder/PublishedElementExtensions.cs
Bjarke Berg 6e89e9a8a9 Merge remote-tracking branch 'origin/netcore/dev' into netcore/feature/AB10314-mb-embedded-dependencies
# Conflicts:
#	src/Umbraco.Infrastructure/ModelsBuilder/ApiVersion.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/Building/Builder.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/Building/ModelsGenerator.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/Building/PropertyModel.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/Building/TextHeaderWriter.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/Building/TypeModel.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/Building/TypeModelHasher.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/LiveModelsProvider.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/ModelsBuilderAssemblyAttribute.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/ModelsBuilderDashboard.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/ModelsGenerationError.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/OutOfDateModelsStatus.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/PublishedElementExtensions.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/PublishedModelUtility.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/RoslynCompiler.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/TypeExtensions.cs
#	src/Umbraco.Infrastructure/ModelsBuilder/UmbracoServices.cs
#	src/Umbraco.ModelsBuilder.Embedded/ImplementPropertyTypeAttribute.cs
#	src/Umbraco.ModelsBuilder.Embedded/Umbraco.ModelsBuilder.Embedded.csproj
#	src/Umbraco.Tests.UnitTests/Umbraco.ModelsBuilder.Embedded/BuilderTests.cs
#	src/Umbraco.Tests.UnitTests/Umbraco.ModelsBuilder.Embedded/UmbracoApplicationTests.cs
#	src/Umbraco.Web.BackOffice/ModelsBuilder/ContentTypeModelValidator.cs
#	src/Umbraco.Web.BackOffice/ModelsBuilder/ContentTypeModelValidatorBase.cs
#	src/Umbraco.Web.BackOffice/ModelsBuilder/DashboardReport.cs
#	src/Umbraco.Web.BackOffice/ModelsBuilder/DisableModelsBuilderNotificationHandler.cs
#	src/Umbraco.Web.BackOffice/ModelsBuilder/MediaTypeModelValidator.cs
#	src/Umbraco.Web.BackOffice/ModelsBuilder/MemberTypeModelValidator.cs
#	src/Umbraco.Web.BackOffice/ModelsBuilder/ModelsBuilderDashboardController.cs
#	src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderExtensions.cs
#	src/Umbraco.Web.Common/ModelsBuilder/ModelsBuilderNotificationHandler.cs
#	src/Umbraco.Web.Common/ModelsBuilder/PureLiveModelFactory.cs
#	src/Umbraco.Web.Common/ModelsBuilder/RefreshingRazorViewEngine.cs
#	src/Umbraco.Web.Common/ModelsBuilder/UmbracoAssemblyLoadContext.cs
#	src/Umbraco.Web.UI.NetCore/Startup.cs
#	src/Umbraco.Web.Website/DependencyInjection/UmbracoBuilderExtensions.cs
2021-02-22 09:00:33 +01:00

52 lines
2.2 KiB
C#

using System;
using System.Linq.Expressions;
using System.Reflection;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Infrastructure.ModelsBuilder;
// same namespace as original Umbraco.Web PublishedElementExtensions
// ReSharper disable once CheckNamespace
namespace Umbraco.Extensions
{
/// <summary>
/// Provides extension methods to models.
/// </summary>
public static class PublishedElementExtensions
{
/// <summary>
/// Gets the value of a property.
/// </summary>
public static TValue ValueFor<TModel, TValue>(this TModel model, IPublishedValueFallback publishedValueFallback, Expression<Func<TModel, TValue>> property, string culture = null, string segment = null, Fallback fallback = default, TValue defaultValue = default)
where TModel : IPublishedElement
{
var alias = GetAlias(model, property);
return model.Value<TValue>(publishedValueFallback, alias, culture, segment, fallback, defaultValue);
}
// fixme that one should be public so ppl can use it
private static string GetAlias<TModel, TValue>(TModel model, Expression<Func<TModel, TValue>> 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<ImplementPropertyTypeAttribute>();
if (attribute == null)
throw new InvalidOperationException("Property is not marked with ImplementPropertyType attribute.");
return attribute.Alias;
}
}
}