2017-11-27 19:17:50 +01:00
using System ;
using System.Linq ;
2019-02-05 19:58:33 +01:00
using Umbraco.Core ;
using Umbraco.Core.Composing ;
2017-11-27 19:17:50 +01:00
using Umbraco.Core.Models ;
2019-02-07 12:43:11 +11:00
using Umbraco.Core.Services ;
2017-11-27 19:17:50 +01:00
namespace Umbraco.Tests.Testing
{
public static class ContentBaseExtensions
{
2019-02-07 13:28:23 +11:00
2017-11-27 19:17:50 +01:00
/// <summary>
2019-02-05 19:58:33 +01:00
/// Set property values by alias with an anonymous object.
2017-11-27 19:17:50 +01:00
/// </summary>
/// <remarks>Does not support variants.</remarks>
2019-02-07 13:28:23 +11:00
public static void PropertyValues ( this IContentBase content , object value , string culture = null , string segment = null )
2017-11-27 19:17:50 +01:00
{
if ( value = = null )
throw new Exception ( "No properties has been passed in" ) ;
var propertyInfos = value . GetType ( ) . GetProperties ( ) ;
foreach ( var propertyInfo in propertyInfos )
{
2019-02-07 12:43:11 +11:00
if ( content . Properties . TryGetValue ( propertyInfo . Name , out var property ) )
2017-11-27 19:17:50 +01:00
{
2019-02-07 12:43:11 +11:00
property . SetValue ( propertyInfo . GetValue ( value , null ) , culture , segment ) ;
2017-11-27 19:17:50 +01:00
//Update item with newly added value
2019-02-07 12:43:11 +11:00
content . Properties . Add ( property ) ;
2017-11-27 19:17:50 +01:00
}
else
{
2019-02-07 12:43:11 +11:00
2019-02-07 13:28:23 +11:00
//fixme: Can this ever happen? According to the ctor in ContentBase (EnsurePropertyTypes), all properties will be created based on the content type's property types
// so how can a property not be resolved by the alias on the content.Properties but it can on the content type?
// This maybe can happen if a developer has removed a property with the api and is trying to then set the value of that property again...
// BUT, as it turns out the content.Properties.Remove(...) method is NEVER used, because why and how could it? you never remove a property from
// a content item directly.
var propertyType = ( ( ContentBase ) content ) . AllPropertyTypes . FirstOrDefault ( x = > x . Alias = = propertyInfo . Name ) ;
2019-02-07 12:43:11 +11:00
if ( propertyType = = null )
throw new Exception ( $"The property alias {propertyInfo.Name} is not valid, because no PropertyType with this alias exists" ) ;
2017-11-27 19:17:50 +01:00
//Create new Property to add to collection
2019-02-07 12:43:11 +11:00
property = propertyType . CreateProperty ( ) ;
2018-05-01 13:30:25 +10:00
property . SetValue ( propertyInfo . GetValue ( value , null ) , culture , segment ) ;
2017-11-27 19:17:50 +01:00
content . Properties . Add ( property ) ;
}
}
}
}
}