using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Models.PublishedContent; namespace Umbraco.Web { /// /// Provides extension methods for IPublishedProperty. /// public static class PublishedPropertyExtension { // see notes in PublishedElementExtensions // private static IPublishedValueFallback PublishedValueFallback => Current.PublishedValueFallback; #region Value public static object Value(this IPublishedProperty property, string culture = null, string segment = null, object defaultValue = default) { if (property.HasValue(culture, segment)) return property.GetValue(culture, segment); return PublishedValueFallback.GetValue(property, culture, segment, defaultValue); } #endregion #region Value public static T Value(this IPublishedProperty property, string culture = null, string segment = null, T defaultValue = default) { // for Value when defaultValue is not specified, and HasValue() is false, we still want to convert the result (see below) // but we have no way to tell whether default value is specified or not - we could do it with overloads, but then defaultValue // comes right after property and conflicts with culture when T is string - so we're just not doing it - if defaultValue is // default, whether specified or not, we give a chance to the converter // //if (!property.HasValue(culture, segment) && 'defaultValue is explicitely specified') return defaultValue; // give the converter a chance to handle the default value differently // eg for IEnumerable it may return Enumerable.Empty instead of null var value = property.GetValue(culture, segment); // if value is null (strange but why not) it still is OK to call TryConvertTo // because it's an extension method (hence no NullRef) which will return a // failed attempt. So, no need to care for value being null here. // if already the requested type, return if (value is T variable) return variable; // if can convert to requested type, return var convert = value.TryConvertTo(); if (convert.Success) return convert.Result; // at that point, the code tried with the raw value // that makes no sense because it sort of is unpredictable, // you wouldn't know when the converters run or don't run. // so, it's commented out now. // try with the raw value //var source = property.ValueSource; //if (source is string) source = TextValueConverterHelper.ParseStringValueSource((string)source); //if (source is T) return (T)source; //convert = source.TryConvertTo(); //if (convert.Success) return convert.Result; return defaultValue; } #endregion } }