diff --git a/src/Umbraco.Core/Models/Content.cs b/src/Umbraco.Core/Models/Content.cs index b8e96c2793..c5b080d397 100644 --- a/src/Umbraco.Core/Models/Content.cs +++ b/src/Umbraco.Core/Models/Content.cs @@ -75,14 +75,19 @@ namespace Umbraco.Core.Models _contentType = contentType; } - private static readonly PropertyInfo TemplateSelector = ExpressionHelper.GetPropertyInfo(x => x.Template); - private static readonly PropertyInfo PublishedSelector = ExpressionHelper.GetPropertyInfo(x => x.Published); - private static readonly PropertyInfo LanguageSelector = ExpressionHelper.GetPropertyInfo(x => x.Language); - private static readonly PropertyInfo ReleaseDateSelector = ExpressionHelper.GetPropertyInfo(x => x.ReleaseDate); - private static readonly PropertyInfo ExpireDateSelector = ExpressionHelper.GetPropertyInfo(x => x.ExpireDate); - private static readonly PropertyInfo WriterSelector = ExpressionHelper.GetPropertyInfo(x => x.WriterId); - private static readonly PropertyInfo NodeNameSelector = ExpressionHelper.GetPropertyInfo(x => x.NodeName); - private static readonly PropertyInfo PermissionsChangedSelector = ExpressionHelper.GetPropertyInfo(x => x.PermissionsChanged); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo TemplateSelector = ExpressionHelper.GetPropertyInfo(x => x.Template); + public readonly PropertyInfo PublishedSelector = ExpressionHelper.GetPropertyInfo(x => x.Published); + public readonly PropertyInfo LanguageSelector = ExpressionHelper.GetPropertyInfo(x => x.Language); + public readonly PropertyInfo ReleaseDateSelector = ExpressionHelper.GetPropertyInfo(x => x.ReleaseDate); + public readonly PropertyInfo ExpireDateSelector = ExpressionHelper.GetPropertyInfo(x => x.ExpireDate); + public readonly PropertyInfo WriterSelector = ExpressionHelper.GetPropertyInfo(x => x.WriterId); + public readonly PropertyInfo NodeNameSelector = ExpressionHelper.GetPropertyInfo(x => x.NodeName); + public readonly PropertyInfo PermissionsChangedSelector = ExpressionHelper.GetPropertyInfo(x => x.PermissionsChanged); + } /// /// Gets or sets the template used by the Content. @@ -96,14 +101,7 @@ namespace Umbraco.Core.Models public virtual ITemplate Template { get { return _template; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _template = value; - return _template; - }, _template, TemplateSelector); - } + set { _template = SetPropertyValueAndDetectChanges(value, _template, Ps.Value.TemplateSelector); } } /// @@ -141,14 +139,7 @@ namespace Umbraco.Core.Models public bool Published { get { return _published; } - internal set - { - SetPropertyValueAndDetectChanges(o => - { - _published = value; - return _published; - }, _published, PublishedSelector); - } + internal set { _published = SetPropertyValueAndDetectChanges(value, _published, Ps.Value.PublishedSelector); } } /// @@ -158,14 +149,7 @@ namespace Umbraco.Core.Models public string Language { get { return _language; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _language = value; - return _language; - }, _language, LanguageSelector); - } + set { _language = SetPropertyValueAndDetectChanges(value, _language, Ps.Value.LanguageSelector); } } /// @@ -175,14 +159,7 @@ namespace Umbraco.Core.Models public DateTime? ReleaseDate { get { return _releaseDate; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _releaseDate = value; - return _releaseDate; - }, _releaseDate, ReleaseDateSelector); - } + set { _releaseDate = SetPropertyValueAndDetectChanges(value, _releaseDate, Ps.Value.ReleaseDateSelector); } } /// @@ -192,14 +169,7 @@ namespace Umbraco.Core.Models public DateTime? ExpireDate { get { return _expireDate; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _expireDate = value; - return _expireDate; - }, _expireDate, ExpireDateSelector); - } + set { _expireDate = SetPropertyValueAndDetectChanges(value, _expireDate, Ps.Value.ExpireDateSelector); } } /// @@ -209,14 +179,7 @@ namespace Umbraco.Core.Models public virtual int WriterId { get { return _writer; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _writer = value; - return _writer; - }, _writer, WriterSelector); - } + set { _writer = SetPropertyValueAndDetectChanges(value, _writer, Ps.Value.WriterSelector); } } /// @@ -229,14 +192,7 @@ namespace Umbraco.Core.Models internal string NodeName { get { return _nodeName; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _nodeName = value; - return _nodeName; - }, _nodeName, NodeNameSelector); - } + set { _nodeName = SetPropertyValueAndDetectChanges(value, _nodeName, Ps.Value.NodeNameSelector); } } /// @@ -246,14 +202,7 @@ namespace Umbraco.Core.Models internal bool PermissionsChanged { get { return _permissionsChanged; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _permissionsChanged = value; - return _permissionsChanged; - }, _permissionsChanged, PermissionsChangedSelector); - } + set { _permissionsChanged = SetPropertyValueAndDetectChanges(value, _permissionsChanged, Ps.Value.PermissionsChangedSelector); } } /// diff --git a/src/Umbraco.Core/Models/ContentBase.cs b/src/Umbraco.Core/Models/ContentBase.cs index b3d0f693d9..36172c5f73 100644 --- a/src/Umbraco.Core/Models/ContentBase.cs +++ b/src/Umbraco.Core/Models/ContentBase.cs @@ -81,19 +81,24 @@ namespace Umbraco.Core.Models _additionalData = new Dictionary(); } - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); - private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); - private static readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); - private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); - private static readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); - private static readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); - private static readonly PropertyInfo DefaultContentTypeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeId); - private readonly static PropertyInfo PropertyCollectionSelector = ExpressionHelper.GetPropertyInfo(x => x.Properties); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + public readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); + public readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); + public readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); + public readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); + public readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); + public readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); + public readonly PropertyInfo DefaultContentTypeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeId); + public readonly PropertyInfo PropertyCollectionSelector = ExpressionHelper.GetPropertyInfo(x => x.Properties); + } protected void PropertiesChanged(object sender, NotifyCollectionChangedEventArgs e) { - OnPropertyChanged(PropertyCollectionSelector); + OnPropertyChanged(Ps.Value.PropertyCollectionSelector); } /// @@ -114,7 +119,7 @@ namespace Umbraco.Core.Models set { _parentId = new Lazy(() => value); - OnPropertyChanged(ParentIdSelector); + OnPropertyChanged(Ps.Value.ParentIdSelector); } } @@ -125,14 +130,7 @@ namespace Umbraco.Core.Models public virtual string Name { get { return _name; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _name = value; - return _name; - }, _name, NameSelector); - } + set { _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.NameSelector); } } /// @@ -142,14 +140,7 @@ namespace Umbraco.Core.Models public virtual int SortOrder { get { return _sortOrder; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _sortOrder = value; - return _sortOrder; - }, _sortOrder, SortOrderSelector); - } + set { _sortOrder = SetPropertyValueAndDetectChanges(value, _sortOrder, Ps.Value.SortOrderSelector); } } /// @@ -159,14 +150,7 @@ namespace Umbraco.Core.Models public virtual int Level { get { return _level; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _level = value; - return _level; - }, _level, LevelSelector); - } + set { _level = SetPropertyValueAndDetectChanges(value, _level, Ps.Value.LevelSelector); } } /// @@ -176,14 +160,7 @@ namespace Umbraco.Core.Models public virtual string Path //Setting this value should be handled by the class not the user { get { return _path; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _path = value; - return _path; - }, _path, PathSelector); - } + set { _path = SetPropertyValueAndDetectChanges(value, _path, Ps.Value.PathSelector); } } /// @@ -193,14 +170,7 @@ namespace Umbraco.Core.Models public virtual int CreatorId { get { return _creatorId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _creatorId = value; - return _creatorId; - }, _creatorId, CreatorIdSelector); - } + set { _creatorId = SetPropertyValueAndDetectChanges(value, _creatorId, Ps.Value.CreatorIdSelector); } } /// @@ -212,14 +182,7 @@ namespace Umbraco.Core.Models public virtual bool Trashed //Setting this value should be handled by the class not the user { get { return _trashed; } - internal set - { - SetPropertyValueAndDetectChanges(o => - { - _trashed = value; - return _trashed; - }, _trashed, TrashedSelector); - } + internal set { _trashed = SetPropertyValueAndDetectChanges(value, _trashed, Ps.Value.TrashedSelector); } } /// @@ -244,14 +207,7 @@ namespace Umbraco.Core.Models } return _contentTypeId; } - protected set - { - SetPropertyValueAndDetectChanges(o => - { - _contentTypeId = value; - return _contentTypeId; - }, _contentTypeId, DefaultContentTypeIdSelector); - } + protected set { _contentTypeId = SetPropertyValueAndDetectChanges(value, _contentTypeId, Ps.Value.DefaultContentTypeIdSelector); } } /// diff --git a/src/Umbraco.Core/Models/ContentType.cs b/src/Umbraco.Core/Models/ContentType.cs index 0926e48e31..f6bc6b918c 100644 --- a/src/Umbraco.Core/Models/ContentType.cs +++ b/src/Umbraco.Core/Models/ContentType.cs @@ -48,8 +48,13 @@ namespace Umbraco.Core.Models _allowedTemplates = new List(); } - private static readonly PropertyInfo DefaultTemplateSelector = ExpressionHelper.GetPropertyInfo(x => x.DefaultTemplateId); - private static readonly PropertyInfo AllowedTemplatesSelector = ExpressionHelper.GetPropertyInfo>(x => x.AllowedTemplates); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo DefaultTemplateSelector = ExpressionHelper.GetPropertyInfo(x => x.DefaultTemplateId); + public readonly PropertyInfo AllowedTemplatesSelector = ExpressionHelper.GetPropertyInfo>(x => x.AllowedTemplates); + } /// /// Gets or sets the alias of the default Template. @@ -70,14 +75,7 @@ namespace Umbraco.Core.Models internal int DefaultTemplateId { get { return _defaultTemplate; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _defaultTemplate = value; - return _defaultTemplate; - }, _defaultTemplate, DefaultTemplateSelector); - } + set { _defaultTemplate = SetPropertyValueAndDetectChanges(value, _defaultTemplate, Ps.Value.DefaultTemplateSelector); } } /// @@ -92,11 +90,7 @@ namespace Umbraco.Core.Models get { return _allowedTemplates; } set { - SetPropertyValueAndDetectChanges(o => - { - _allowedTemplates = value; - return _allowedTemplates; - }, _allowedTemplates, AllowedTemplatesSelector, + _allowedTemplates = SetPropertyValueAndDetectChanges(value, _allowedTemplates, Ps.Value.AllowedTemplatesSelector, //Custom comparer for enumerable new DelegateEqualityComparer>( (templates, enumerable) => templates.UnsortedSequenceEqual(enumerable), diff --git a/src/Umbraco.Core/Models/ContentTypeBase.cs b/src/Umbraco.Core/Models/ContentTypeBase.cs index a0305d2cfb..7ac2007f7f 100644 --- a/src/Umbraco.Core/Models/ContentTypeBase.cs +++ b/src/Umbraco.Core/Models/ContentTypeBase.cs @@ -67,33 +67,38 @@ namespace Umbraco.Core.Models _additionalData = new Dictionary(); } - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); - private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); - private static readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); - private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); - private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); - private static readonly PropertyInfo DescriptionSelector = ExpressionHelper.GetPropertyInfo(x => x.Description); - private static readonly PropertyInfo IconSelector = ExpressionHelper.GetPropertyInfo(x => x.Icon); - private static readonly PropertyInfo ThumbnailSelector = ExpressionHelper.GetPropertyInfo(x => x.Thumbnail); - private static readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); - private static readonly PropertyInfo AllowedAsRootSelector = ExpressionHelper.GetPropertyInfo(x => x.AllowedAsRoot); - private static readonly PropertyInfo IsContainerSelector = ExpressionHelper.GetPropertyInfo(x => x.IsContainer); - private static readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); - private static readonly PropertyInfo AllowedContentTypesSelector = ExpressionHelper.GetPropertyInfo>(x => x.AllowedContentTypes); - private static readonly PropertyInfo PropertyGroupCollectionSelector = ExpressionHelper.GetPropertyInfo(x => x.PropertyGroups); - private static readonly PropertyInfo PropertyTypeCollectionSelector = ExpressionHelper.GetPropertyInfo>(x => x.PropertyTypes); - private static readonly PropertyInfo HasPropertyTypeBeenRemovedSelector = ExpressionHelper.GetPropertyInfo(x => x.HasPropertyTypeBeenRemoved); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + public readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); + public readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); + public readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); + public readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); + public readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + public readonly PropertyInfo DescriptionSelector = ExpressionHelper.GetPropertyInfo(x => x.Description); + public readonly PropertyInfo IconSelector = ExpressionHelper.GetPropertyInfo(x => x.Icon); + public readonly PropertyInfo ThumbnailSelector = ExpressionHelper.GetPropertyInfo(x => x.Thumbnail); + public readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); + public readonly PropertyInfo AllowedAsRootSelector = ExpressionHelper.GetPropertyInfo(x => x.AllowedAsRoot); + public readonly PropertyInfo IsContainerSelector = ExpressionHelper.GetPropertyInfo(x => x.IsContainer); + public readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); + public readonly PropertyInfo AllowedContentTypesSelector = ExpressionHelper.GetPropertyInfo>(x => x.AllowedContentTypes); + public readonly PropertyInfo PropertyGroupCollectionSelector = ExpressionHelper.GetPropertyInfo(x => x.PropertyGroups); + public readonly PropertyInfo PropertyTypeCollectionSelector = ExpressionHelper.GetPropertyInfo>(x => x.PropertyTypes); + public readonly PropertyInfo HasPropertyTypeBeenRemovedSelector = ExpressionHelper.GetPropertyInfo(x => x.HasPropertyTypeBeenRemoved); + } protected void PropertyGroupsChanged(object sender, NotifyCollectionChangedEventArgs e) { - OnPropertyChanged(PropertyGroupCollectionSelector); + OnPropertyChanged(Ps.Value.PropertyGroupCollectionSelector); } protected void PropertyTypesChanged(object sender, NotifyCollectionChangedEventArgs e) { - OnPropertyChanged(PropertyTypeCollectionSelector); + OnPropertyChanged(Ps.Value.PropertyTypeCollectionSelector); } /// @@ -115,7 +120,7 @@ namespace Umbraco.Core.Models set { _parentId = new Lazy(() => value); - OnPropertyChanged(ParentIdSelector); + OnPropertyChanged(Ps.Value.ParentIdSelector); } } @@ -126,14 +131,7 @@ namespace Umbraco.Core.Models public virtual string Name { get { return _name; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _name = value; - return _name; - }, _name, NameSelector); - } + set { _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.NameSelector); } } /// @@ -143,14 +141,7 @@ namespace Umbraco.Core.Models public virtual int Level //NOTE Is this relevant for a ContentType? { get { return _level; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _level = value; - return _level; - }, _level, LevelSelector); - } + set { _level = SetPropertyValueAndDetectChanges(value, _level, Ps.Value.LevelSelector); } } /// @@ -160,14 +151,7 @@ namespace Umbraco.Core.Models public virtual string Path //NOTE Is this relevant for a ContentType? { get { return _path; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _path = value; - return _path; - }, _path, PathSelector); - } + set { _path = SetPropertyValueAndDetectChanges(value, _path, Ps.Value.PathSelector); } } /// @@ -179,12 +163,10 @@ namespace Umbraco.Core.Models get { return _alias; } set { - SetPropertyValueAndDetectChanges(o => - { - //_alias = value.ToSafeAlias(); - _alias = value.ToCleanString(CleanStringType.Alias | CleanStringType.UmbracoCase); - return _alias; - }, _alias, AliasSelector); + _alias = SetPropertyValueAndDetectChanges( + value.ToCleanString(CleanStringType.Alias | CleanStringType.UmbracoCase), + _alias, + Ps.Value.AliasSelector); } } @@ -195,14 +177,7 @@ namespace Umbraco.Core.Models public virtual string Description { get { return _description; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _description = value; - return _description; - }, _description, DescriptionSelector); - } + set { _description = SetPropertyValueAndDetectChanges(value, _description, Ps.Value.DescriptionSelector); } } /// @@ -212,14 +187,7 @@ namespace Umbraco.Core.Models public virtual int SortOrder { get { return _sortOrder; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _sortOrder = value; - return _sortOrder; - }, _sortOrder, SortOrderSelector); - } + set { _sortOrder = SetPropertyValueAndDetectChanges(value, _sortOrder, Ps.Value.SortOrderSelector); } } /// @@ -229,14 +197,7 @@ namespace Umbraco.Core.Models public virtual string Icon { get { return _icon; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _icon = value; - return _icon; - }, _icon, IconSelector); - } + set { _icon = SetPropertyValueAndDetectChanges(value, _icon, Ps.Value.IconSelector); } } /// @@ -246,14 +207,7 @@ namespace Umbraco.Core.Models public virtual string Thumbnail { get { return _thumbnail; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _thumbnail = value; - return _thumbnail; - }, _thumbnail, ThumbnailSelector); - } + set { _thumbnail = SetPropertyValueAndDetectChanges(value, _thumbnail, Ps.Value.ThumbnailSelector); } } /// @@ -263,14 +217,7 @@ namespace Umbraco.Core.Models public virtual int CreatorId { get { return _creatorId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _creatorId = value; - return _creatorId; - }, _creatorId, CreatorIdSelector); - } + set { _creatorId = SetPropertyValueAndDetectChanges(value, _creatorId, Ps.Value.CreatorIdSelector); } } /// @@ -280,14 +227,7 @@ namespace Umbraco.Core.Models public virtual bool AllowedAsRoot { get { return _allowedAsRoot; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _allowedAsRoot = value; - return _allowedAsRoot; - }, _allowedAsRoot, AllowedAsRootSelector); - } + set { _allowedAsRoot = SetPropertyValueAndDetectChanges(value, _allowedAsRoot, Ps.Value.AllowedAsRootSelector); } } /// @@ -300,14 +240,7 @@ namespace Umbraco.Core.Models public virtual bool IsContainer { get { return _isContainer; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _isContainer = value; - return _isContainer; - }, _isContainer, IsContainerSelector); - } + set { _isContainer = SetPropertyValueAndDetectChanges(value, _isContainer, Ps.Value.IsContainerSelector); } } /// @@ -318,14 +251,7 @@ namespace Umbraco.Core.Models public virtual bool Trashed //NOTE Is this relevant for a ContentType? { get { return _trashed; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _trashed = value; - return _trashed; - }, _trashed, TrashedSelector); - } + set { _trashed = SetPropertyValueAndDetectChanges(value, _trashed, Ps.Value.TrashedSelector); } } private IDictionary _additionalData; @@ -347,15 +273,11 @@ namespace Umbraco.Core.Models get { return _allowedContentTypes; } set { - SetPropertyValueAndDetectChanges(o => - { - _allowedContentTypes = value; - return _allowedContentTypes; - }, _allowedContentTypes, AllowedContentTypesSelector, + _allowedContentTypes = SetPropertyValueAndDetectChanges(value, _allowedContentTypes, Ps.Value.AllowedContentTypesSelector, //Custom comparer for enumerable new DelegateEqualityComparer>( (sorts, enumerable) => sorts.UnsortedSequenceEqual(enumerable), - sorts => sorts.GetHashCode())); + sorts => sorts.GetHashCode())); } } @@ -418,7 +340,7 @@ namespace Umbraco.Core.Models private set { _hasPropertyTypeBeenRemoved = value; - OnPropertyChanged(HasPropertyTypeBeenRemovedSelector); + OnPropertyChanged(Ps.Value.HasPropertyTypeBeenRemovedSelector); } } @@ -543,7 +465,7 @@ namespace Umbraco.Core.Models // actually remove the group PropertyGroups.RemoveItem(propertyGroupName); - OnPropertyChanged(PropertyGroupCollectionSelector); + OnPropertyChanged(Ps.Value.PropertyGroupCollectionSelector); } /// diff --git a/src/Umbraco.Core/Models/ContentTypeCompositionBase.cs b/src/Umbraco.Core/Models/ContentTypeCompositionBase.cs index 4cf4a08bf1..f55db3ac57 100644 --- a/src/Umbraco.Core/Models/ContentTypeCompositionBase.cs +++ b/src/Umbraco.Core/Models/ContentTypeCompositionBase.cs @@ -32,7 +32,7 @@ namespace Umbraco.Core.Models AddContentType(parent); } - private static readonly PropertyInfo ContentTypeCompositionSelector = + public readonly PropertyInfo ContentTypeCompositionSelector = ExpressionHelper.GetPropertyInfo>( x => x.ContentTypeComposition); diff --git a/src/Umbraco.Core/Models/DataTypeDefinition.cs b/src/Umbraco.Core/Models/DataTypeDefinition.cs index 4c12d6fbef..bfff842c30 100644 --- a/src/Umbraco.Core/Models/DataTypeDefinition.cs +++ b/src/Umbraco.Core/Models/DataTypeDefinition.cs @@ -65,15 +65,20 @@ namespace Umbraco.Core.Models _additionalData = new Dictionary(); } - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); - private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); - private static readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); - private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); - private static readonly PropertyInfo UserIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); - private static readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); - private static readonly PropertyInfo PropertyEditorAliasSelector = ExpressionHelper.GetPropertyInfo(x => x.PropertyEditorAlias); - private static readonly PropertyInfo DatabaseTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.DatabaseType); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + public readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); + public readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); + public readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); + public readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); + public readonly PropertyInfo UserIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); + public readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); + public readonly PropertyInfo PropertyEditorAliasSelector = ExpressionHelper.GetPropertyInfo(x => x.PropertyEditorAlias); + public readonly PropertyInfo DatabaseTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.DatabaseType); + } /// /// Gets or sets the Id of the Parent entity @@ -83,14 +88,7 @@ namespace Umbraco.Core.Models public int ParentId { get { return _parentId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _parentId = value; - return _parentId; - }, _parentId, ParentIdSelector); - } + set { _parentId = SetPropertyValueAndDetectChanges(value, _parentId, Ps.Value.ParentIdSelector); } } /// @@ -100,14 +98,7 @@ namespace Umbraco.Core.Models public string Name { get { return _name; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _name = value; - return _name; - }, _name, NameSelector); - } + set { _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.NameSelector); } } /// @@ -117,14 +108,7 @@ namespace Umbraco.Core.Models public int SortOrder { get { return _sortOrder; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _sortOrder = value; - return _sortOrder; - }, _sortOrder, SortOrderSelector); - } + set { _sortOrder = SetPropertyValueAndDetectChanges(value, _sortOrder, Ps.Value.SortOrderSelector); } } /// @@ -134,14 +118,7 @@ namespace Umbraco.Core.Models public int Level { get { return _level; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _level = value; - return _level; - }, _level, LevelSelector); - } + set { _level = SetPropertyValueAndDetectChanges(value, _level, Ps.Value.LevelSelector); } } /// @@ -151,14 +128,7 @@ namespace Umbraco.Core.Models public string Path //Setting this value should be handled by the class not the user { get { return _path; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _path = value; - return _path; - }, _path, PathSelector); - } + set { _path = SetPropertyValueAndDetectChanges(value, _path, Ps.Value.PathSelector); } } /// @@ -168,14 +138,7 @@ namespace Umbraco.Core.Models public int CreatorId { get { return _creatorId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _creatorId = value; - return _creatorId; - }, _creatorId, UserIdSelector); - } + set { _creatorId = SetPropertyValueAndDetectChanges(value, _creatorId, Ps.Value.UserIdSelector); } } //NOTE: SD: Why do we have this ?? @@ -189,11 +152,7 @@ namespace Umbraco.Core.Models get { return _trashed; } internal set { - SetPropertyValueAndDetectChanges(o => - { - _trashed = value; - return _trashed; - }, _trashed, TrashedSelector); + _trashed = SetPropertyValueAndDetectChanges(value, _trashed, Ps.Value.TrashedSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data _additionalData["Trashed"] = value; } @@ -205,11 +164,7 @@ namespace Umbraco.Core.Models get { return _propertyEditorAlias; } set { - SetPropertyValueAndDetectChanges(o => - { - _propertyEditorAlias = value; - return _propertyEditorAlias; - }, _propertyEditorAlias, PropertyEditorAliasSelector); + _propertyEditorAlias = SetPropertyValueAndDetectChanges(value, _propertyEditorAlias, Ps.Value.PropertyEditorAliasSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data _additionalData["DatabaseType"] = value; } @@ -245,12 +200,7 @@ namespace Umbraco.Core.Models get { return _databaseType; } set { - SetPropertyValueAndDetectChanges(o => - { - _databaseType = value; - return _databaseType; - }, _databaseType, DatabaseTypeSelector); - + _databaseType = SetPropertyValueAndDetectChanges(value, _databaseType, Ps.Value.DatabaseTypeSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data _additionalData["DatabaseType"] = value; } diff --git a/src/Umbraco.Core/Models/DictionaryItem.cs b/src/Umbraco.Core/Models/DictionaryItem.cs index 749c629d19..a4080d718c 100644 --- a/src/Umbraco.Core/Models/DictionaryItem.cs +++ b/src/Umbraco.Core/Models/DictionaryItem.cs @@ -30,9 +30,14 @@ namespace Umbraco.Core.Models _translations = new List(); } - private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); - private static readonly PropertyInfo ItemKeySelector = ExpressionHelper.GetPropertyInfo(x => x.ItemKey); - private static readonly PropertyInfo TranslationsSelector = ExpressionHelper.GetPropertyInfo>(x => x.Translations); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); + public readonly PropertyInfo ItemKeySelector = ExpressionHelper.GetPropertyInfo(x => x.ItemKey); + public readonly PropertyInfo TranslationsSelector = ExpressionHelper.GetPropertyInfo>(x => x.Translations); + } /// /// Gets or Sets the Parent Id of the Dictionary Item @@ -41,14 +46,7 @@ namespace Umbraco.Core.Models public Guid? ParentId { get { return _parentId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _parentId = value; - return _parentId; - }, _parentId, ParentIdSelector); - } + set { _parentId = SetPropertyValueAndDetectChanges(value, _parentId, Ps.Value.ParentIdSelector); } } /// @@ -58,14 +56,7 @@ namespace Umbraco.Core.Models public string ItemKey { get { return _itemKey; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _itemKey = value; - return _itemKey; - }, _itemKey, ItemKeySelector); - } + set { _itemKey = SetPropertyValueAndDetectChanges(value, _itemKey, Ps.Value.ItemKeySelector); } } /// @@ -77,25 +68,21 @@ namespace Umbraco.Core.Models get { return _translations; } set { - SetPropertyValueAndDetectChanges(o => + var asArray = value.ToArray(); + //ensure the language callback is set on each translation + if (GetLanguage != null) { - var asArray = value.ToArray(); - //ensure the language callback is set on each translation - if (GetLanguage != null) + foreach (var translation in asArray.OfType()) { - foreach (var translation in asArray.OfType()) - { - translation.GetLanguage = GetLanguage; - } + translation.GetLanguage = GetLanguage; } + } - _translations = asArray; - return _translations; - }, _translations, TranslationsSelector, + _translations = SetPropertyValueAndDetectChanges(asArray, _translations, Ps.Value.TranslationsSelector, //Custom comparer for enumerable new DelegateEqualityComparer>( (enumerable, translations) => enumerable.UnsortedSequenceEqual(translations), - enumerable => enumerable.GetHashCode())); + enumerable => enumerable.GetHashCode())); } } } diff --git a/src/Umbraco.Core/Models/DictionaryTranslation.cs b/src/Umbraco.Core/Models/DictionaryTranslation.cs index 59f96dbe85..7748ab1613 100644 --- a/src/Umbraco.Core/Models/DictionaryTranslation.cs +++ b/src/Umbraco.Core/Models/DictionaryTranslation.cs @@ -50,8 +50,13 @@ namespace Umbraco.Core.Models Key = uniqueId; } - private static readonly PropertyInfo LanguageSelector = ExpressionHelper.GetPropertyInfo(x => x.Language); - private static readonly PropertyInfo ValueSelector = ExpressionHelper.GetPropertyInfo(x => x.Value); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo LanguageSelector = ExpressionHelper.GetPropertyInfo(x => x.Language); + public readonly PropertyInfo ValueSelector = ExpressionHelper.GetPropertyInfo(x => x.Value); + } /// /// Gets or sets the for the translation @@ -79,12 +84,8 @@ namespace Umbraco.Core.Models } set { - SetPropertyValueAndDetectChanges(o => - { - _language = value; - _languageId = _language == null ? -1 : _language.Id; - return _language; - }, _language, LanguageSelector); + _language = SetPropertyValueAndDetectChanges(value, _language, Ps.Value.LanguageSelector); + _languageId = _language == null ? -1 : _language.Id; } } @@ -100,14 +101,7 @@ namespace Umbraco.Core.Models public string Value { get { return _value; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _value = value; - return _value; - }, _value, ValueSelector); - } + set { _value = SetPropertyValueAndDetectChanges(value, _value, Ps.Value.ValueSelector); } } public override object DeepClone() diff --git a/src/Umbraco.Core/Models/EntityBase/Entity.cs b/src/Umbraco.Core/Models/EntityBase/Entity.cs index c4838dfd0a..d260c2f7de 100644 --- a/src/Umbraco.Core/Models/EntityBase/Entity.cs +++ b/src/Umbraco.Core/Models/EntityBase/Entity.cs @@ -23,13 +23,17 @@ namespace Umbraco.Core.Models.EntityBase private DateTime _updateDate; private bool _wasCancelled; - private static readonly PropertyInfo IdSelector = ExpressionHelper.GetPropertyInfo(x => x.Id); - private static readonly PropertyInfo KeySelector = ExpressionHelper.GetPropertyInfo(x => x.Key); - private static readonly PropertyInfo CreateDateSelector = ExpressionHelper.GetPropertyInfo(x => x.CreateDate); - private static readonly PropertyInfo UpdateDateSelector = ExpressionHelper.GetPropertyInfo(x => x.UpdateDate); - private static readonly PropertyInfo HasIdentitySelector = ExpressionHelper.GetPropertyInfo(x => x.HasIdentity); - private static readonly PropertyInfo WasCancelledSelector = ExpressionHelper.GetPropertyInfo(x => x.WasCancelled); - + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo IdSelector = ExpressionHelper.GetPropertyInfo(x => x.Id); + public readonly PropertyInfo KeySelector = ExpressionHelper.GetPropertyInfo(x => x.Key); + public readonly PropertyInfo CreateDateSelector = ExpressionHelper.GetPropertyInfo(x => x.CreateDate); + public readonly PropertyInfo UpdateDateSelector = ExpressionHelper.GetPropertyInfo(x => x.UpdateDate); + public readonly PropertyInfo HasIdentitySelector = ExpressionHelper.GetPropertyInfo(x => x.HasIdentity); + public readonly PropertyInfo WasCancelledSelector = ExpressionHelper.GetPropertyInfo(x => x.WasCancelled); + } /// /// Integer Id @@ -37,18 +41,11 @@ namespace Umbraco.Core.Models.EntityBase [DataMember] public int Id { - get - { - return _id; - } + get { return _id; } set { - SetPropertyValueAndDetectChanges(o => - { - _id = value; - HasIdentity = true; //set the has Identity - return _id; - }, _id, IdSelector); + _id = SetPropertyValueAndDetectChanges(value, _id, Ps.Value.IdSelector); + HasIdentity = true; //set the has Identity } } @@ -67,14 +64,7 @@ namespace Umbraco.Core.Models.EntityBase _key = Guid.NewGuid(); return _key; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _key = value; - return _key; - }, _key, KeySelector); - } + set { _key = SetPropertyValueAndDetectChanges(value, _key, Ps.Value.KeySelector); } } /// @@ -84,14 +74,7 @@ namespace Umbraco.Core.Models.EntityBase public DateTime CreateDate { get { return _createDate; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _createDate = value; - return _createDate; - }, _createDate, CreateDateSelector); - } + set { _createDate = SetPropertyValueAndDetectChanges(value, _createDate, Ps.Value.CreateDateSelector); } } /// @@ -105,14 +88,7 @@ namespace Umbraco.Core.Models.EntityBase internal bool WasCancelled { get { return _wasCancelled; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _wasCancelled = value; - return _wasCancelled; - }, _wasCancelled, WasCancelledSelector); - } + set { _wasCancelled = SetPropertyValueAndDetectChanges(value, _wasCancelled, Ps.Value.WasCancelledSelector); } } /// @@ -122,14 +98,7 @@ namespace Umbraco.Core.Models.EntityBase public DateTime UpdateDate { get { return _updateDate; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _updateDate = value; - return _updateDate; - }, _updateDate, UpdateDateSelector); - } + set { _updateDate = SetPropertyValueAndDetectChanges(value, _updateDate, Ps.Value.UpdateDateSelector); } } internal virtual void ResetIdentity() @@ -166,14 +135,7 @@ namespace Umbraco.Core.Models.EntityBase { return _hasIdentity; } - protected set - { - SetPropertyValueAndDetectChanges(o => - { - _hasIdentity = value; - return _hasIdentity; - }, _hasIdentity, HasIdentitySelector); - } + protected set { _hasIdentity = SetPropertyValueAndDetectChanges(value, _hasIdentity, Ps.Value.HasIdentitySelector); } } //TODO: Make this NOT virtual or even exist really! diff --git a/src/Umbraco.Core/Models/EntityBase/TracksChangesEntityBase.cs b/src/Umbraco.Core/Models/EntityBase/TracksChangesEntityBase.cs index 43da67297f..f2d57873b5 100644 --- a/src/Umbraco.Core/Models/EntityBase/TracksChangesEntityBase.cs +++ b/src/Umbraco.Core/Models/EntityBase/TracksChangesEntityBase.cs @@ -93,7 +93,7 @@ namespace Umbraco.Core.Models.EntityBase /// True if Property was changed, otherwise False. Returns false if the entity had not been previously changed. public virtual bool WasPropertyDirty(string propertyName) { - return WasDirty() && _lastPropertyChangedInfo.Any(x => x.Key == propertyName); + return _lastPropertyChangedInfo != null && _lastPropertyChangedInfo.Any(x => x.Key == propertyName); } /// @@ -133,7 +133,10 @@ namespace Umbraco.Core.Models.EntityBase if (rememberPreviouslyChangedProperties) { //copy the changed properties to the last changed properties - _lastPropertyChangedInfo = _propertyChangedInfo.ToDictionary(v => v.Key, v => v.Value); + if (_propertyChangedInfo != null) + { + _lastPropertyChangedInfo = _propertyChangedInfo.ToDictionary(v => v.Key, v => v.Value); + } } //NOTE: We cannot .Clear() because when we memberwise clone this will be the SAME @@ -161,8 +164,8 @@ namespace Umbraco.Core.Models.EntityBase /// Used by inheritors to set the value of properties, this will detect if the property value actually changed and if it did /// it will ensure that the property has a dirty flag set. /// - /// - /// + /// + /// /// /// returns true if the value changed /// @@ -170,26 +173,22 @@ namespace Umbraco.Core.Models.EntityBase /// save a document type, nearly all properties are flagged as dirty just because we've 'reset' them, but they are all set /// to the same value, so it's really not dirty. /// - internal bool SetPropertyValueAndDetectChanges(Func setValue, T value, PropertyInfo propertySelector) + internal T SetPropertyValueAndDetectChanges(T newVal, T origVal, PropertyInfo propertySelector) { if ((typeof(T) == typeof(string) == false) && TypeHelper.IsTypeAssignableFrom(typeof(T))) { throw new InvalidOperationException("This method does not support IEnumerable instances. For IEnumerable instances a manual custom equality check will be required"); } - return SetPropertyValueAndDetectChanges(setValue, value, propertySelector, - new DelegateEqualityComparer( - //Standard Equals comparison - (arg1, arg2) => Equals(arg1, arg2), - arg => arg.GetHashCode())); + return SetPropertyValueAndDetectChanges(newVal, origVal, propertySelector, EqualityComparer.Default); } /// /// Used by inheritors to set the value of properties, this will detect if the property value actually changed and if it did /// it will ensure that the property has a dirty flag set. /// - /// - /// + /// + /// /// /// The equality comparer to use /// returns true if the value changed @@ -198,18 +197,17 @@ namespace Umbraco.Core.Models.EntityBase /// save a document type, nearly all properties are flagged as dirty just because we've 'reset' them, but they are all set /// to the same value, so it's really not dirty. /// - internal bool SetPropertyValueAndDetectChanges(Func setValue, T value, PropertyInfo propertySelector, IEqualityComparer comparer) + internal T SetPropertyValueAndDetectChanges(T newVal, T origVal, PropertyInfo propertySelector, IEqualityComparer comparer) { - var initVal = value; - var newVal = setValue(value); + //don't track changes, just return the value + if (_changeTrackingEnabled == false) return newVal; - //don't track changes, just set the value (above) - if (_changeTrackingEnabled == false) return false; + if (comparer.Equals(origVal, newVal) == false) + { + OnPropertyChanged(propertySelector); + } - if (comparer.Equals(initVal, newVal)) return false; - - OnPropertyChanged(propertySelector); - return true; + return newVal; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/File.cs b/src/Umbraco.Core/Models/File.cs index 8ead6da5f8..cd4296e6a6 100644 --- a/src/Umbraco.Core/Models/File.cs +++ b/src/Umbraco.Core/Models/File.cs @@ -33,8 +33,14 @@ namespace Umbraco.Core.Models _content = getFileContent != null ? null : string.Empty; } - private static readonly PropertyInfo ContentSelector = ExpressionHelper.GetPropertyInfo(x => x.Content); - private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo ContentSelector = ExpressionHelper.GetPropertyInfo(x => x.Content); + public readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); + } + private string _alias; private string _name; @@ -87,11 +93,7 @@ namespace Umbraco.Core.Models _alias = null; _name = null; - SetPropertyValueAndDetectChanges(o => - { - _path = SanitizePath(value); - return _path; - }, _path, PathSelector); + _path = SetPropertyValueAndDetectChanges(SanitizePath(value), _path, Ps.Value.PathSelector); } } @@ -131,11 +133,9 @@ namespace Umbraco.Core.Models } set { - SetPropertyValueAndDetectChanges(o => - { - _content = value ?? string.Empty; // cannot set to null - return _content; - }, _content, ContentSelector); + _content = SetPropertyValueAndDetectChanges( + value ?? string.Empty, // cannot set to null + _content, Ps.Value.ContentSelector); } } diff --git a/src/Umbraco.Core/Models/Language.cs b/src/Umbraco.Core/Models/Language.cs index b23bbfb52a..0a6f14114d 100644 --- a/src/Umbraco.Core/Models/Language.cs +++ b/src/Umbraco.Core/Models/Language.cs @@ -21,8 +21,13 @@ namespace Umbraco.Core.Models IsoCode = isoCode; } - private static readonly PropertyInfo IsoCodeSelector = ExpressionHelper.GetPropertyInfo(x => x.IsoCode); - private static readonly PropertyInfo CultureNameSelector = ExpressionHelper.GetPropertyInfo(x => x.CultureName); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo IsoCodeSelector = ExpressionHelper.GetPropertyInfo(x => x.IsoCode); + public readonly PropertyInfo CultureNameSelector = ExpressionHelper.GetPropertyInfo(x => x.CultureName); + } /// /// Gets or sets the Iso Code for the Language @@ -31,14 +36,7 @@ namespace Umbraco.Core.Models public string IsoCode { get { return _isoCode; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _isoCode = value; - return _isoCode; - }, _isoCode, IsoCodeSelector); - } + set { _isoCode = SetPropertyValueAndDetectChanges(value, _isoCode, Ps.Value.IsoCodeSelector); } } /// @@ -48,14 +46,7 @@ namespace Umbraco.Core.Models public string CultureName { get { return _cultureName; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _cultureName = value; - return _cultureName; - }, _cultureName, CultureNameSelector); - } + set { _cultureName = SetPropertyValueAndDetectChanges(value, _cultureName, Ps.Value.CultureNameSelector); } } /// diff --git a/src/Umbraco.Core/Models/Macro.cs b/src/Umbraco.Core/Models/Macro.cs index a15639f886..476b25ef32 100644 --- a/src/Umbraco.Core/Models/Macro.cs +++ b/src/Umbraco.Core/Models/Macro.cs @@ -114,22 +114,27 @@ namespace Umbraco.Core.Models private List _addedProperties; private List _removedProperties; - private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - private static readonly PropertyInfo UseInEditorSelector = ExpressionHelper.GetPropertyInfo(x => x.UseInEditor); - private static readonly PropertyInfo CacheDurationSelector = ExpressionHelper.GetPropertyInfo(x => x.CacheDuration); - private static readonly PropertyInfo CacheByPageSelector = ExpressionHelper.GetPropertyInfo(x => x.CacheByPage); - private static readonly PropertyInfo CacheByMemberSelector = ExpressionHelper.GetPropertyInfo(x => x.CacheByMember); - private static readonly PropertyInfo DontRenderSelector = ExpressionHelper.GetPropertyInfo(x => x.DontRender); - private static readonly PropertyInfo ControlPathSelector = ExpressionHelper.GetPropertyInfo(x => x.ControlType); - private static readonly PropertyInfo ControlAssemblySelector = ExpressionHelper.GetPropertyInfo(x => x.ControlAssembly); - private static readonly PropertyInfo ScriptPathSelector = ExpressionHelper.GetPropertyInfo(x => x.ScriptPath); - private static readonly PropertyInfo XsltPathSelector = ExpressionHelper.GetPropertyInfo(x => x.XsltPath); - private static readonly PropertyInfo PropertiesSelector = ExpressionHelper.GetPropertyInfo(x => x.Properties); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + public readonly PropertyInfo UseInEditorSelector = ExpressionHelper.GetPropertyInfo(x => x.UseInEditor); + public readonly PropertyInfo CacheDurationSelector = ExpressionHelper.GetPropertyInfo(x => x.CacheDuration); + public readonly PropertyInfo CacheByPageSelector = ExpressionHelper.GetPropertyInfo(x => x.CacheByPage); + public readonly PropertyInfo CacheByMemberSelector = ExpressionHelper.GetPropertyInfo(x => x.CacheByMember); + public readonly PropertyInfo DontRenderSelector = ExpressionHelper.GetPropertyInfo(x => x.DontRender); + public readonly PropertyInfo ControlPathSelector = ExpressionHelper.GetPropertyInfo(x => x.ControlType); + public readonly PropertyInfo ControlAssemblySelector = ExpressionHelper.GetPropertyInfo(x => x.ControlAssembly); + public readonly PropertyInfo ScriptPathSelector = ExpressionHelper.GetPropertyInfo(x => x.ScriptPath); + public readonly PropertyInfo XsltPathSelector = ExpressionHelper.GetPropertyInfo(x => x.XsltPath); + public readonly PropertyInfo PropertiesSelector = ExpressionHelper.GetPropertyInfo(x => x.Properties); + } void PropertiesChanged(object sender, NotifyCollectionChangedEventArgs e) { - OnPropertyChanged(PropertiesSelector); + OnPropertyChanged(Ps.Value.PropertiesSelector); if (e.Action == NotifyCollectionChangedAction.Add) { @@ -167,7 +172,7 @@ namespace Umbraco.Core.Models /// void PropertyDataChanged(object sender, PropertyChangedEventArgs e) { - OnPropertyChanged(PropertiesSelector); + OnPropertyChanged(Ps.Value.PropertiesSelector); } public override void ResetDirtyProperties(bool rememberPreviouslyChangedProperties) @@ -204,14 +209,7 @@ namespace Umbraco.Core.Models public string Alias { get { return _alias; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _alias = value.ToCleanString(CleanStringType.Alias); - return _alias; - }, _alias, AliasSelector); - } + set { _alias = SetPropertyValueAndDetectChanges(value.ToCleanString(CleanStringType.Alias), _alias, Ps.Value.AliasSelector); } } /// @@ -221,14 +219,7 @@ namespace Umbraco.Core.Models public string Name { get { return _name; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _name = value; - return _name; - }, _name, NameSelector); - } + set { _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.NameSelector); } } /// @@ -238,14 +229,7 @@ namespace Umbraco.Core.Models public bool UseInEditor { get { return _useInEditor; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _useInEditor = value; - return _useInEditor; - }, _useInEditor, UseInEditorSelector); - } + set { _useInEditor = SetPropertyValueAndDetectChanges(value, _useInEditor, Ps.Value.UseInEditorSelector); } } /// @@ -255,14 +239,7 @@ namespace Umbraco.Core.Models public int CacheDuration { get { return _cacheDuration; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _cacheDuration = value; - return _cacheDuration; - }, _cacheDuration, CacheDurationSelector); - } + set { _cacheDuration = SetPropertyValueAndDetectChanges(value, _cacheDuration, Ps.Value.CacheDurationSelector); } } /// @@ -272,14 +249,7 @@ namespace Umbraco.Core.Models public bool CacheByPage { get { return _cacheByPage; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _cacheByPage = value; - return _cacheByPage; - }, _cacheByPage, CacheByPageSelector); - } + set { _cacheByPage = SetPropertyValueAndDetectChanges(value, _cacheByPage, Ps.Value.CacheByPageSelector); } } /// @@ -289,14 +259,7 @@ namespace Umbraco.Core.Models public bool CacheByMember { get { return _cacheByMember; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _cacheByMember = value; - return _cacheByMember; - }, _cacheByMember, CacheByMemberSelector); - } + set { _cacheByMember = SetPropertyValueAndDetectChanges(value, _cacheByMember, Ps.Value.CacheByMemberSelector); } } /// @@ -306,14 +269,7 @@ namespace Umbraco.Core.Models public bool DontRender { get { return _dontRender; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _dontRender = value; - return _dontRender; - }, _dontRender, DontRenderSelector); - } + set { _dontRender = SetPropertyValueAndDetectChanges(value, _dontRender, Ps.Value.DontRenderSelector); } } /// @@ -323,14 +279,7 @@ namespace Umbraco.Core.Models public string ControlType { get { return _scriptFile; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _scriptFile = value; - return _scriptFile; - }, _scriptFile, ControlPathSelector); - } + set { _scriptFile = SetPropertyValueAndDetectChanges(value, _scriptFile, Ps.Value.ControlPathSelector); } } /// @@ -341,14 +290,7 @@ namespace Umbraco.Core.Models public string ControlAssembly { get { return _scriptAssembly; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _scriptAssembly = value; - return _scriptAssembly; - }, _scriptAssembly, ControlAssemblySelector); - } + set { _scriptAssembly = SetPropertyValueAndDetectChanges(value, _scriptAssembly, Ps.Value.ControlAssemblySelector); } } /// @@ -359,14 +301,7 @@ namespace Umbraco.Core.Models public string ScriptPath { get { return _scriptPath; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _scriptPath = value; - return _scriptPath; - }, _scriptPath, ScriptPathSelector); - } + set { _scriptPath = SetPropertyValueAndDetectChanges(value, _scriptPath, Ps.Value.ScriptPathSelector); } } /// @@ -377,14 +312,7 @@ namespace Umbraco.Core.Models public string XsltPath { get { return _xslt; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _xslt = value; - return _xslt; - }, _xslt, XsltPathSelector); - } + set { _xslt = SetPropertyValueAndDetectChanges(value, _xslt, Ps.Value.XsltPathSelector); } } /// diff --git a/src/Umbraco.Core/Models/MacroProperty.cs b/src/Umbraco.Core/Models/MacroProperty.cs index 17fef44a87..e200225292 100644 --- a/src/Umbraco.Core/Models/MacroProperty.cs +++ b/src/Umbraco.Core/Models/MacroProperty.cs @@ -72,11 +72,16 @@ namespace Umbraco.Core.Models private int _id; private string _editorAlias; - private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); - private static readonly PropertyInfo IdSelector = ExpressionHelper.GetPropertyInfo(x => x.Id); - private static readonly PropertyInfo PropertyTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.EditorAlias); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + public readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); + public readonly PropertyInfo IdSelector = ExpressionHelper.GetPropertyInfo(x => x.Id); + public readonly PropertyInfo PropertyTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.EditorAlias); + } /// /// Gets or sets the Alias of the Property @@ -85,14 +90,7 @@ namespace Umbraco.Core.Models public int Id { get { return _id; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _id = value; - return _alias; - }, _alias, IdSelector); - } + set { _id = SetPropertyValueAndDetectChanges(value, _id, Ps.Value.IdSelector); } } /// @@ -102,14 +100,7 @@ namespace Umbraco.Core.Models public string Alias { get { return _alias; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _alias = value; - return _alias; - }, _alias, AliasSelector); - } + set { _alias = SetPropertyValueAndDetectChanges(value, _alias, Ps.Value.AliasSelector); } } /// @@ -119,14 +110,7 @@ namespace Umbraco.Core.Models public string Name { get { return _name; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _name = value; - return _name; - }, _name, NameSelector); - } + set { _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.NameSelector); } } /// @@ -136,14 +120,7 @@ namespace Umbraco.Core.Models public int SortOrder { get { return _sortOrder; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _sortOrder = value; - return _sortOrder; - }, _sortOrder, SortOrderSelector); - } + set { _sortOrder = SetPropertyValueAndDetectChanges(value, _sortOrder, Ps.Value.SortOrderSelector); } } /// @@ -159,21 +136,10 @@ namespace Umbraco.Core.Models get { return _editorAlias; } set { - SetPropertyValueAndDetectChanges(o => - { - //try to get the new mapped parameter editor - var mapped = LegacyParameterEditorAliasConverter.GetNewAliasFromLegacyAlias(value, false); - if (mapped.IsNullOrWhiteSpace() == false) - { - _editorAlias = mapped; - } - else - { - _editorAlias = value; - } - - return _editorAlias; - }, _editorAlias, PropertyTypeSelector); + //try to get the new mapped parameter editor + var mapped = LegacyParameterEditorAliasConverter.GetNewAliasFromLegacyAlias(value, false); + var newVal = mapped.IsNullOrWhiteSpace() == false ? mapped : value; + _editorAlias = SetPropertyValueAndDetectChanges(newVal, _editorAlias, Ps.Value.PropertyTypeSelector); } } diff --git a/src/Umbraco.Core/Models/Member.cs b/src/Umbraco.Core/Models/Member.cs index 70c21e4307..f21e3558f2 100644 --- a/src/Umbraco.Core/Models/Member.cs +++ b/src/Umbraco.Core/Models/Member.cs @@ -109,10 +109,15 @@ namespace Umbraco.Core.Models IsApproved = true; } - private static readonly PropertyInfo UsernameSelector = ExpressionHelper.GetPropertyInfo(x => x.Username); - private static readonly PropertyInfo EmailSelector = ExpressionHelper.GetPropertyInfo(x => x.Email); - private static readonly PropertyInfo PasswordSelector = ExpressionHelper.GetPropertyInfo(x => x.RawPasswordValue); - private static readonly PropertyInfo ProviderUserKeySelector = ExpressionHelper.GetPropertyInfo(x => x.ProviderUserKey); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo UsernameSelector = ExpressionHelper.GetPropertyInfo(x => x.Username); + public readonly PropertyInfo EmailSelector = ExpressionHelper.GetPropertyInfo(x => x.Email); + public readonly PropertyInfo PasswordSelector = ExpressionHelper.GetPropertyInfo(x => x.RawPasswordValue); + public readonly PropertyInfo ProviderUserKeySelector = ExpressionHelper.GetPropertyInfo(x => x.ProviderUserKey); + } /// /// Gets or sets the Username @@ -121,14 +126,7 @@ namespace Umbraco.Core.Models public string Username { get { return _username; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _username = value; - return _username; - }, _username, UsernameSelector); - } + set { _username = SetPropertyValueAndDetectChanges(value, _username, Ps.Value.UsernameSelector); } } /// @@ -138,14 +136,7 @@ namespace Umbraco.Core.Models public string Email { get { return _email; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _email = value; - return _email; - }, _email, EmailSelector); - } + set { _email = SetPropertyValueAndDetectChanges(value, _email, Ps.Value.EmailSelector); } } /// @@ -155,14 +146,7 @@ namespace Umbraco.Core.Models public string RawPasswordValue { get { return _rawPasswordValue; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _rawPasswordValue = value; - return _rawPasswordValue; - }, _rawPasswordValue, PasswordSelector); - } + set { _rawPasswordValue = SetPropertyValueAndDetectChanges(value, _rawPasswordValue, Ps.Value.PasswordSelector); } } /// @@ -490,14 +474,7 @@ namespace Umbraco.Core.Models { return _providerUserKey; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _providerUserKey = value; - return _providerUserKey; - }, _providerUserKey, ProviderUserKeySelector); - } + set { _providerUserKey = SetPropertyValueAndDetectChanges(value, _providerUserKey, Ps.Value.ProviderUserKeySelector); } } diff --git a/src/Umbraco.Core/Models/MemberGroup.cs b/src/Umbraco.Core/Models/MemberGroup.cs index ff7e05be9e..0a3be6c8f2 100644 --- a/src/Umbraco.Core/Models/MemberGroup.cs +++ b/src/Umbraco.Core/Models/MemberGroup.cs @@ -21,8 +21,13 @@ namespace Umbraco.Core.Models private string _name; private int _creatorId; - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - private static readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + public readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); + } [DataMember] public string Name @@ -30,33 +35,22 @@ namespace Umbraco.Core.Models get { return _name; } set { - SetPropertyValueAndDetectChanges(o => + if (_name != value) { - if (_name != value) - { - //if the name has changed, add the value to the additional data, - //this is required purely for event handlers to know the previous name of the group - //so we can keep the public access up to date. - AdditionalData["previousName"] = _name; - } + //if the name has changed, add the value to the additional data, + //this is required purely for event handlers to know the previous name of the group + //so we can keep the public access up to date. + AdditionalData["previousName"] = _name; + } - _name = value; - return _name; - }, _name, NameSelector); + _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.NameSelector); } } public int CreatorId { get { return _creatorId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _creatorId = value; - return _creatorId; - }, _creatorId, CreatorIdSelector); - } + set { _creatorId = SetPropertyValueAndDetectChanges(value, _creatorId, Ps.Value.CreatorIdSelector); } } public IDictionary AdditionalData { get; private set; } diff --git a/src/Umbraco.Core/Models/MemberType.cs b/src/Umbraco.Core/Models/MemberType.cs index 9000a33b54..6f5dc8a022 100644 --- a/src/Umbraco.Core/Models/MemberType.cs +++ b/src/Umbraco.Core/Models/MemberType.cs @@ -30,7 +30,12 @@ namespace Umbraco.Core.Models MemberTypePropertyTypes = new Dictionary(); } - private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + } /// /// The Alias of the ContentType @@ -50,13 +55,11 @@ namespace Umbraco.Core.Models // .ToCleanString(CleanStringType.Alias | CleanStringType.UmbracoCase) // Need to ask Stephen - SetPropertyValueAndDetectChanges(o => - { - _alias = value == "_umbracoSystemDefaultProtectType" - ? value - : (value == null ? string.Empty : value.ToSafeAlias() ); - return _alias; - }, _alias, AliasSelector); + var newVal = value == "_umbracoSystemDefaultProtectType" + ? value + : (value == null ? string.Empty : value.ToSafeAlias()); + + _alias = SetPropertyValueAndDetectChanges(newVal, _alias, Ps.Value.AliasSelector); } } diff --git a/src/Umbraco.Core/Models/Membership/User.cs b/src/Umbraco.Core/Models/Membership/User.cs index c743893037..c54cfa2035 100644 --- a/src/Umbraco.Core/Models/Membership/User.cs +++ b/src/Umbraco.Core/Models/Membership/User.cs @@ -77,27 +77,32 @@ namespace Umbraco.Core.Models.Membership private bool _defaultToLiveEditing; - private static readonly PropertyInfo FailedPasswordAttemptsSelector = ExpressionHelper.GetPropertyInfo(x => x.FailedPasswordAttempts); - private static readonly PropertyInfo LastLockoutDateSelector = ExpressionHelper.GetPropertyInfo(x => x.LastLockoutDate); - private static readonly PropertyInfo LastLoginDateSelector = ExpressionHelper.GetPropertyInfo(x => x.LastLoginDate); - private static readonly PropertyInfo LastPasswordChangeDateSelector = ExpressionHelper.GetPropertyInfo(x => x.LastPasswordChangeDate); + private static readonly Lazy Ps = new Lazy(); - private static readonly PropertyInfo SecurityStampSelector = ExpressionHelper.GetPropertyInfo(x => x.SecurityStamp); - private static readonly PropertyInfo SessionTimeoutSelector = ExpressionHelper.GetPropertyInfo(x => x.SessionTimeout); - private static readonly PropertyInfo StartContentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.StartContentId); - private static readonly PropertyInfo StartMediaIdSelector = ExpressionHelper.GetPropertyInfo(x => x.StartMediaId); - private static readonly PropertyInfo AllowedSectionsSelector = ExpressionHelper.GetPropertyInfo>(x => x.AllowedSections); - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - - private static readonly PropertyInfo UsernameSelector = ExpressionHelper.GetPropertyInfo(x => x.Username); - private static readonly PropertyInfo EmailSelector = ExpressionHelper.GetPropertyInfo(x => x.Email); - private static readonly PropertyInfo PasswordSelector = ExpressionHelper.GetPropertyInfo(x => x.RawPasswordValue); - private static readonly PropertyInfo IsLockedOutSelector = ExpressionHelper.GetPropertyInfo(x => x.IsLockedOut); - private static readonly PropertyInfo IsApprovedSelector = ExpressionHelper.GetPropertyInfo(x => x.IsApproved); - private static readonly PropertyInfo LanguageSelector = ExpressionHelper.GetPropertyInfo(x => x.Language); + private class PropertySelectors + { + public readonly PropertyInfo FailedPasswordAttemptsSelector = ExpressionHelper.GetPropertyInfo(x => x.FailedPasswordAttempts); + public readonly PropertyInfo LastLockoutDateSelector = ExpressionHelper.GetPropertyInfo(x => x.LastLockoutDate); + public readonly PropertyInfo LastLoginDateSelector = ExpressionHelper.GetPropertyInfo(x => x.LastLoginDate); + public readonly PropertyInfo LastPasswordChangeDateSelector = ExpressionHelper.GetPropertyInfo(x => x.LastPasswordChangeDate); - private static readonly PropertyInfo DefaultToLiveEditingSelector = ExpressionHelper.GetPropertyInfo(x => x.DefaultToLiveEditing); - private static readonly PropertyInfo UserTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.UserType); + public readonly PropertyInfo SecurityStampSelector = ExpressionHelper.GetPropertyInfo(x => x.SecurityStamp); + public readonly PropertyInfo SessionTimeoutSelector = ExpressionHelper.GetPropertyInfo(x => x.SessionTimeout); + public readonly PropertyInfo StartContentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.StartContentId); + public readonly PropertyInfo StartMediaIdSelector = ExpressionHelper.GetPropertyInfo(x => x.StartMediaId); + public readonly PropertyInfo AllowedSectionsSelector = ExpressionHelper.GetPropertyInfo>(x => x.AllowedSections); + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + + public readonly PropertyInfo UsernameSelector = ExpressionHelper.GetPropertyInfo(x => x.Username); + public readonly PropertyInfo EmailSelector = ExpressionHelper.GetPropertyInfo(x => x.Email); + public readonly PropertyInfo PasswordSelector = ExpressionHelper.GetPropertyInfo(x => x.RawPasswordValue); + public readonly PropertyInfo IsLockedOutSelector = ExpressionHelper.GetPropertyInfo(x => x.IsLockedOut); + public readonly PropertyInfo IsApprovedSelector = ExpressionHelper.GetPropertyInfo(x => x.IsApproved); + public readonly PropertyInfo LanguageSelector = ExpressionHelper.GetPropertyInfo(x => x.Language); + + public readonly PropertyInfo DefaultToLiveEditingSelector = ExpressionHelper.GetPropertyInfo(x => x.DefaultToLiveEditing); + public readonly PropertyInfo UserTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.UserType); + } #region Implementation of IMembershipUser @@ -113,124 +118,61 @@ namespace Umbraco.Core.Models.Membership public string Username { get { return _username; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _username = value; - return _username; - }, _username, UsernameSelector); - } + set { _username = SetPropertyValueAndDetectChanges(value, _username, Ps.Value.UsernameSelector); } } [DataMember] public string Email { get { return _email; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _email = value; - return _email; - }, _email, EmailSelector); - } + set { _email = SetPropertyValueAndDetectChanges(value, _email, Ps.Value.EmailSelector); } } [DataMember] public string RawPasswordValue { get { return _rawPasswordValue; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _rawPasswordValue = value; - return _rawPasswordValue; - }, _rawPasswordValue, PasswordSelector); - } + set { _rawPasswordValue = SetPropertyValueAndDetectChanges(value, _rawPasswordValue, Ps.Value.PasswordSelector); } } [DataMember] public bool IsApproved { get { return _isApproved; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _isApproved = value; - return _isApproved; - }, _isApproved, IsApprovedSelector); - } + set { _isApproved = SetPropertyValueAndDetectChanges(value, _isApproved, Ps.Value.IsApprovedSelector); } } [IgnoreDataMember] public bool IsLockedOut { get { return _isLockedOut; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _isLockedOut = value; - return _isLockedOut; - }, _isLockedOut, IsLockedOutSelector); - } + set { _isLockedOut = SetPropertyValueAndDetectChanges(value, _isLockedOut, Ps.Value.IsLockedOutSelector); } } [IgnoreDataMember] public DateTime LastLoginDate { get { return _lastLoginDate; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _lastLoginDate = value; - return _lastLoginDate; - }, _lastLoginDate, LastLoginDateSelector); - } + set { _lastLoginDate = SetPropertyValueAndDetectChanges(value, _lastLoginDate, Ps.Value.LastLoginDateSelector); } } [IgnoreDataMember] public DateTime LastPasswordChangeDate { get { return _lastPasswordChangedDate; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _lastPasswordChangedDate = value; - return _lastPasswordChangedDate; - }, _lastPasswordChangedDate, LastPasswordChangeDateSelector); - } + set { _lastPasswordChangedDate = SetPropertyValueAndDetectChanges(value, _lastPasswordChangedDate, Ps.Value.LastPasswordChangeDateSelector); } } [IgnoreDataMember] public DateTime LastLockoutDate { get { return _lastLockoutDate; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _lastLockoutDate = value; - return _lastLockoutDate; - }, _lastLockoutDate, LastLockoutDateSelector); - } + set { _lastLockoutDate = SetPropertyValueAndDetectChanges(value, _lastLockoutDate, Ps.Value.LastLockoutDateSelector); } } [IgnoreDataMember] public int FailedPasswordAttempts { get { return _failedLoginAttempts; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _failedLoginAttempts = value; - return _failedLoginAttempts; - }, _failedLoginAttempts, FailedPasswordAttemptsSelector); - } + set { _failedLoginAttempts = SetPropertyValueAndDetectChanges(value, _failedLoginAttempts, Ps.Value.FailedPasswordAttemptsSelector); } } //TODO: Figure out how to support all of this! - we cannot have NotImplementedExceptions because these get used by the IMembershipMemberService service so @@ -251,14 +193,7 @@ namespace Umbraco.Core.Models.Membership public string Name { get { return _name; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _name = value; - return _name; - }, _name, NameSelector); - } + set { _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.NameSelector); } } public IEnumerable AllowedSections @@ -294,14 +229,7 @@ namespace Umbraco.Core.Models.Membership public string SecurityStamp { get { return _securityStamp; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _securityStamp = value; - return _securityStamp; - }, _securityStamp, SecurityStampSelector); - } + set { _securityStamp = SetPropertyValueAndDetectChanges(value, _securityStamp, Ps.Value.SecurityStampSelector); } } /// @@ -330,14 +258,7 @@ namespace Umbraco.Core.Models.Membership public int SessionTimeout { get { return _sessionTimeout; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _sessionTimeout = value; - return _sessionTimeout; - }, _sessionTimeout, SessionTimeoutSelector); - } + set { _sessionTimeout = SetPropertyValueAndDetectChanges(value, _sessionTimeout, Ps.Value.SessionTimeoutSelector); } } /// @@ -350,14 +271,7 @@ namespace Umbraco.Core.Models.Membership public int StartContentId { get { return _startContentId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _startContentId = value; - return _startContentId; - }, _startContentId, StartContentIdSelector); - } + set { _startContentId = SetPropertyValueAndDetectChanges(value, _startContentId, Ps.Value.StartContentIdSelector); } } /// @@ -370,28 +284,14 @@ namespace Umbraco.Core.Models.Membership public int StartMediaId { get { return _startMediaId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _startMediaId = value; - return _startMediaId; - }, _startMediaId, StartMediaIdSelector); - } + set { _startMediaId = SetPropertyValueAndDetectChanges(value, _startMediaId, Ps.Value.StartMediaIdSelector); } } [DataMember] public string Language { get { return _language; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _language = value; - return _language; - }, _language, LanguageSelector); - } + set { _language = SetPropertyValueAndDetectChanges(value, _language, Ps.Value.LanguageSelector); } } //TODO: This should be a private set @@ -406,14 +306,7 @@ namespace Umbraco.Core.Models.Membership internal bool DefaultToLiveEditing { get { return _defaultToLiveEditing; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _defaultToLiveEditing = value; - return _defaultToLiveEditing; - }, _defaultToLiveEditing, DefaultToLiveEditingSelector); - } + set { _defaultToLiveEditing = SetPropertyValueAndDetectChanges(value, _defaultToLiveEditing, Ps.Value.DefaultToLiveEditingSelector); } } [IgnoreDataMember] @@ -427,11 +320,7 @@ namespace Umbraco.Core.Models.Membership throw new InvalidOperationException("Cannot assign a User Type that has not been persisted"); } - SetPropertyValueAndDetectChanges(o => - { - _userType = value; - return _userType; - }, _userType, UserTypeSelector); + _userType = SetPropertyValueAndDetectChanges(value, _userType, Ps.Value.UserTypeSelector); } } @@ -457,7 +346,7 @@ namespace Umbraco.Core.Models.Membership /// void SectionCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { - OnPropertyChanged(AllowedSectionsSelector); + OnPropertyChanged(Ps.Value.AllowedSectionsSelector); if (e.Action == NotifyCollectionChangedAction.Add) { diff --git a/src/Umbraco.Core/Models/Membership/UserType.cs b/src/Umbraco.Core/Models/Membership/UserType.cs index 5c32e57f38..74b561c67c 100644 --- a/src/Umbraco.Core/Models/Membership/UserType.cs +++ b/src/Umbraco.Core/Models/Membership/UserType.cs @@ -20,9 +20,14 @@ namespace Umbraco.Core.Models.Membership private string _name; private IEnumerable _permissions; - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); - private static readonly PropertyInfo PermissionsSelector = ExpressionHelper.GetPropertyInfo>(x => x.Permissions); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + public readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + public readonly PropertyInfo PermissionsSelector = ExpressionHelper.GetPropertyInfo>(x => x.Permissions); + } [DataMember] public string Alias @@ -30,11 +35,10 @@ namespace Umbraco.Core.Models.Membership get { return _alias; } set { - SetPropertyValueAndDetectChanges(o => - { - _alias = value.ToCleanString(CleanStringType.Alias | CleanStringType.UmbracoCase); - return _alias; - }, _alias, AliasSelector); + _alias = SetPropertyValueAndDetectChanges( + value.ToCleanString(CleanStringType.Alias | CleanStringType.UmbracoCase), + _alias, + Ps.Value.AliasSelector); } } @@ -42,14 +46,7 @@ namespace Umbraco.Core.Models.Membership public string Name { get { return _name; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _name = value; - return _name; - }, _name, NameSelector); - } + set { _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.NameSelector); } } /// @@ -64,11 +61,7 @@ namespace Umbraco.Core.Models.Membership get { return _permissions; } set { - SetPropertyValueAndDetectChanges(o => - { - _permissions = value; - return _permissions; - }, _permissions, PermissionsSelector, + _permissions = SetPropertyValueAndDetectChanges(value, _permissions, Ps.Value.PermissionsSelector, //Custom comparer for enumerable new DelegateEqualityComparer>( (enum1, enum2) => enum1.UnsortedSequenceEqual(enum2), diff --git a/src/Umbraco.Core/Models/MigrationEntry.cs b/src/Umbraco.Core/Models/MigrationEntry.cs index e756e92629..72c6e3cc89 100644 --- a/src/Umbraco.Core/Models/MigrationEntry.cs +++ b/src/Umbraco.Core/Models/MigrationEntry.cs @@ -19,35 +19,27 @@ namespace Umbraco.Core.Models _version = version; } - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.MigrationName); - private static readonly PropertyInfo VersionSelector = ExpressionHelper.GetPropertyInfo(x => x.Version); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.MigrationName); + public readonly PropertyInfo VersionSelector = ExpressionHelper.GetPropertyInfo(x => x.Version); + } + private string _migrationName; private SemVersion _version; public string MigrationName { get { return _migrationName; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _migrationName = value; - return _migrationName; - }, _migrationName, NameSelector); - } + set { _migrationName = SetPropertyValueAndDetectChanges(value, _migrationName, Ps.Value.NameSelector); } } public SemVersion Version { get { return _version; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _version = value; - return _version; - }, _version, VersionSelector); - } + set { _version = SetPropertyValueAndDetectChanges(value, _version, Ps.Value.VersionSelector); } } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Property.cs b/src/Umbraco.Core/Models/Property.cs index f3fbefda4f..0833cf0b90 100644 --- a/src/Umbraco.Core/Models/Property.cs +++ b/src/Umbraco.Core/Models/Property.cs @@ -45,8 +45,13 @@ namespace Umbraco.Core.Models Value = value; } - private static readonly PropertyInfo ValueSelector = ExpressionHelper.GetPropertyInfo(x => x.Value); - private static readonly PropertyInfo VersionSelector = ExpressionHelper.GetPropertyInfo(x => x.Version); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo ValueSelector = ExpressionHelper.GetPropertyInfo(x => x.Value); + public readonly PropertyInfo VersionSelector = ExpressionHelper.GetPropertyInfo(x => x.Version); + } /// /// Returns the instance of the tag support, by default tags are not enabled @@ -98,14 +103,7 @@ namespace Umbraco.Core.Models public Guid Version { get { return _version; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _version = value; - return _version; - }, _version, VersionSelector); - } + set { _version = SetPropertyValueAndDetectChanges(value, _version, Ps.Value.VersionSelector); } } /// @@ -173,39 +171,35 @@ namespace Umbraco.Core.Models } } - SetPropertyValueAndDetectChanges(o => - { - _value = value; - return _value; - }, _value, ValueSelector, - new DelegateEqualityComparer( - (o, o1) => - { - if (o == null && o1 == null) return true; - - //custom comparer for strings. - if (o is string || o1 is string) + _value = SetPropertyValueAndDetectChanges(value, _value, Ps.Value.ValueSelector, + new DelegateEqualityComparer( + (o, o1) => { - //if one is null and another is empty then they are the same - if ((o as string).IsNullOrWhiteSpace() && (o1 as string).IsNullOrWhiteSpace()) + if (o == null && o1 == null) return true; + + //custom comparer for strings. + if (o is string || o1 is string) { - return true; + //if one is null and another is empty then they are the same + if ((o as string).IsNullOrWhiteSpace() && (o1 as string).IsNullOrWhiteSpace()) + { + return true; + } + if (o == null || o1 == null) return false; + return o.Equals(o1); } - if (o == null || o1 == null) return false; - return o.Equals(o1); - } - - if (o == null || o1 == null) return false; - //Custom comparer for enumerable if it is enumerable - var enum1 = o as IEnumerable; - var enum2 = o1 as IEnumerable; - if (enum1 != null && enum2 != null) - { - return enum1.Cast().UnsortedSequenceEqual(enum2.Cast()); - } - return o.Equals(o1); - }, o => o.GetHashCode())); + if (o == null || o1 == null) return false; + + //Custom comparer for enumerable if it is enumerable + var enum1 = o as IEnumerable; + var enum2 = o1 as IEnumerable; + if (enum1 != null && enum2 != null) + { + return enum1.Cast().UnsortedSequenceEqual(enum2.Cast()); + } + return o.Equals(o1); + }, o => o.GetHashCode())); } } diff --git a/src/Umbraco.Core/Models/PropertyGroup.cs b/src/Umbraco.Core/Models/PropertyGroup.cs index de88012c0e..49f930a9ea 100644 --- a/src/Umbraco.Core/Models/PropertyGroup.cs +++ b/src/Umbraco.Core/Models/PropertyGroup.cs @@ -29,12 +29,18 @@ namespace Umbraco.Core.Models PropertyTypes = propertyTypeCollection; } - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); - private readonly static PropertyInfo PropertyTypeCollectionSelector = ExpressionHelper.GetPropertyInfo(x => x.PropertyTypes); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + public readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); + public readonly PropertyInfo PropertyTypeCollectionSelector = ExpressionHelper.GetPropertyInfo(x => x.PropertyTypes); + } + void PropertyTypesChanged(object sender, NotifyCollectionChangedEventArgs e) { - OnPropertyChanged(PropertyTypeCollectionSelector); + OnPropertyChanged(Ps.Value.PropertyTypeCollectionSelector); } /// @@ -44,14 +50,7 @@ namespace Umbraco.Core.Models public string Name { get { return _name; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _name = value; - return _name; - }, _name, NameSelector); - } + set { _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.NameSelector); } } /// @@ -61,14 +60,7 @@ namespace Umbraco.Core.Models public int SortOrder { get { return _sortOrder; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _sortOrder = value; - return _sortOrder; - }, _sortOrder, SortOrderSelector); - } + set { _sortOrder = SetPropertyValueAndDetectChanges(value, _sortOrder, Ps.Value.SortOrderSelector); } } /// diff --git a/src/Umbraco.Core/Models/PropertyType.cs b/src/Umbraco.Core/Models/PropertyType.cs index 846b907197..0f54b47b5e 100644 --- a/src/Umbraco.Core/Models/PropertyType.cs +++ b/src/Umbraco.Core/Models/PropertyType.cs @@ -46,7 +46,7 @@ namespace Umbraco.Core.Models public PropertyType(IDataTypeDefinition dataTypeDefinition, string propertyTypeAlias) : this(dataTypeDefinition) { - SetAlias(propertyTypeAlias); + _alias = GetAlias(propertyTypeAlias); } public PropertyType(string propertyEditorAlias, DataTypeDatabaseType dataTypeDatabaseType) @@ -84,20 +84,25 @@ namespace Umbraco.Core.Models _isExplicitDbType = isExplicitDbType; _propertyEditorAlias = propertyEditorAlias; _dataTypeDatabaseType = dataTypeDatabaseType; - SetAlias(propertyTypeAlias); + _alias = GetAlias(propertyTypeAlias); } - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); - private static readonly PropertyInfo DescriptionSelector = ExpressionHelper.GetPropertyInfo(x => x.Description); - private static readonly PropertyInfo DataTypeDefinitionIdSelector = ExpressionHelper.GetPropertyInfo(x => x.DataTypeDefinitionId); - private static readonly PropertyInfo PropertyEditorAliasSelector = ExpressionHelper.GetPropertyInfo(x => x.PropertyEditorAlias); - private static readonly PropertyInfo DataTypeDatabaseTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.DataTypeDatabaseType); - private static readonly PropertyInfo MandatorySelector = ExpressionHelper.GetPropertyInfo(x => x.Mandatory); - private static readonly PropertyInfo HelpTextSelector = ExpressionHelper.GetPropertyInfo(x => x.HelpText); - private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); - private static readonly PropertyInfo ValidationRegExpSelector = ExpressionHelper.GetPropertyInfo(x => x.ValidationRegExp); - private static readonly PropertyInfo PropertyGroupIdSelector = ExpressionHelper.GetPropertyInfo>(x => x.PropertyGroupId); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + public readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + public readonly PropertyInfo DescriptionSelector = ExpressionHelper.GetPropertyInfo(x => x.Description); + public readonly PropertyInfo DataTypeDefinitionIdSelector = ExpressionHelper.GetPropertyInfo(x => x.DataTypeDefinitionId); + public readonly PropertyInfo PropertyEditorAliasSelector = ExpressionHelper.GetPropertyInfo(x => x.PropertyEditorAlias); + public readonly PropertyInfo DataTypeDatabaseTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.DataTypeDatabaseType); + public readonly PropertyInfo MandatorySelector = ExpressionHelper.GetPropertyInfo(x => x.Mandatory); + public readonly PropertyInfo HelpTextSelector = ExpressionHelper.GetPropertyInfo(x => x.HelpText); + public readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); + public readonly PropertyInfo ValidationRegExpSelector = ExpressionHelper.GetPropertyInfo(x => x.ValidationRegExp); + public readonly PropertyInfo PropertyGroupIdSelector = ExpressionHelper.GetPropertyInfo>(x => x.PropertyGroupId); + } /// /// Gets of Sets the Name of the PropertyType @@ -106,14 +111,7 @@ namespace Umbraco.Core.Models public string Name { get { return _name; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _name = value; - return _name; - }, _name, NameSelector); - } + set { _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.NameSelector); } } /// @@ -123,14 +121,7 @@ namespace Umbraco.Core.Models public string Alias { get { return _alias; } - set - { - SetPropertyValueAndDetectChanges(o => - { - SetAlias(value); - return _alias; - }, _alias, AliasSelector); - } + set { _alias = SetPropertyValueAndDetectChanges(GetAlias(value), _alias, Ps.Value.AliasSelector); } } /// @@ -140,14 +131,7 @@ namespace Umbraco.Core.Models public string Description { get { return _description; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _description = value; - return _description; - }, _description, DescriptionSelector); - } + set { _description = SetPropertyValueAndDetectChanges(value, _description, Ps.Value.DescriptionSelector); } } /// @@ -158,28 +142,14 @@ namespace Umbraco.Core.Models public int DataTypeDefinitionId { get { return _dataTypeDefinitionId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _dataTypeDefinitionId = value; - return _dataTypeDefinitionId; - }, _dataTypeDefinitionId, DataTypeDefinitionIdSelector); - } + set { _dataTypeDefinitionId = SetPropertyValueAndDetectChanges(value, _dataTypeDefinitionId, Ps.Value.DataTypeDefinitionIdSelector); } } [DataMember] public string PropertyEditorAlias { get { return _propertyEditorAlias; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _propertyEditorAlias = value; - return _propertyEditorAlias; - }, _propertyEditorAlias, PropertyEditorAliasSelector); - } + set { _propertyEditorAlias = SetPropertyValueAndDetectChanges(value, _propertyEditorAlias, Ps.Value.PropertyEditorAliasSelector); } } /// @@ -213,11 +183,7 @@ namespace Umbraco.Core.Models //don't allow setting this if an explicit declaration has been made in the ctor if (_isExplicitDbType) return; - SetPropertyValueAndDetectChanges(o => - { - _dataTypeDatabaseType = value; - return _dataTypeDatabaseType; - }, _dataTypeDatabaseType, DataTypeDatabaseTypeSelector); + _dataTypeDatabaseType = SetPropertyValueAndDetectChanges(value, _dataTypeDatabaseType, Ps.Value.DataTypeDatabaseTypeSelector); } } @@ -229,14 +195,7 @@ namespace Umbraco.Core.Models internal Lazy PropertyGroupId { get { return _propertyGroupId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _propertyGroupId = value; - return _propertyGroupId; - }, _propertyGroupId, PropertyGroupIdSelector); - } + set { _propertyGroupId = SetPropertyValueAndDetectChanges(value, _propertyGroupId, Ps.Value.PropertyGroupIdSelector); } } /// @@ -246,14 +205,7 @@ namespace Umbraco.Core.Models public bool Mandatory { get { return _mandatory; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _mandatory = value; - return _mandatory; - }, _mandatory, MandatorySelector); - } + set { _mandatory = SetPropertyValueAndDetectChanges(value, _mandatory, Ps.Value.MandatorySelector); } } /// @@ -264,14 +216,7 @@ namespace Umbraco.Core.Models public string HelpText { get { return _helpText; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _helpText = value; - return _helpText; - }, _helpText, HelpTextSelector); - } + set { _helpText = SetPropertyValueAndDetectChanges(value, _helpText, Ps.Value.HelpTextSelector); } } /// @@ -281,14 +226,7 @@ namespace Umbraco.Core.Models public int SortOrder { get { return _sortOrder; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _sortOrder = value; - return _sortOrder; - }, _sortOrder, SortOrderSelector); - } + set { _sortOrder = SetPropertyValueAndDetectChanges(value, _sortOrder, Ps.Value.SortOrderSelector); } } /// @@ -298,23 +236,16 @@ namespace Umbraco.Core.Models public string ValidationRegExp { get { return _validationRegExp; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _validationRegExp = value; - return _validationRegExp; - }, _validationRegExp, ValidationRegExpSelector); - } + set { _validationRegExp = SetPropertyValueAndDetectChanges(value, _validationRegExp, Ps.Value.ValidationRegExpSelector); } } - private void SetAlias(string value) + private string GetAlias(string value) { //NOTE: WE are doing this because we don't want to do a ToSafeAlias when the alias is the special case of // being prefixed with Constants.PropertyEditors.InternalGenericPropertiesPrefix // which is used internally - _alias = value.StartsWith(Constants.PropertyEditors.InternalGenericPropertiesPrefix) + return value.StartsWith(Constants.PropertyEditors.InternalGenericPropertiesPrefix) ? value : value.ToCleanString(CleanStringType.Alias | CleanStringType.UmbracoCase); } diff --git a/src/Umbraco.Core/Models/PublicAccessEntry.cs b/src/Umbraco.Core/Models/PublicAccessEntry.cs index 9e12d6ab57..aedf3f01c1 100644 --- a/src/Umbraco.Core/Models/PublicAccessEntry.cs +++ b/src/Umbraco.Core/Models/PublicAccessEntry.cs @@ -44,7 +44,7 @@ namespace Umbraco.Core.Models void _ruleCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { - OnPropertyChanged(AllowedSectionsSelector); + OnPropertyChanged(Ps.Value.AllowedSectionsSelector); //if (e.Action == NotifyCollectionChangedAction.Add) //{ @@ -68,10 +68,15 @@ namespace Umbraco.Core.Models } } - private static readonly PropertyInfo ProtectedNodeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ProtectedNodeId); - private static readonly PropertyInfo LoginNodeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.LoginNodeId); - private static readonly PropertyInfo NoAccessNodeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.NoAccessNodeId); - private static readonly PropertyInfo AllowedSectionsSelector = ExpressionHelper.GetPropertyInfo>(x => x.Rules); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo ProtectedNodeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ProtectedNodeId); + public readonly PropertyInfo LoginNodeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.LoginNodeId); + public readonly PropertyInfo NoAccessNodeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.NoAccessNodeId); + public readonly PropertyInfo AllowedSectionsSelector = ExpressionHelper.GetPropertyInfo>(x => x.Rules); + } internal IEnumerable RemovedRules { @@ -112,42 +117,21 @@ namespace Umbraco.Core.Models public int LoginNodeId { get { return _loginNodeId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _loginNodeId = value; - return _loginNodeId; - }, _loginNodeId, LoginNodeIdSelector); - } + set { _loginNodeId = SetPropertyValueAndDetectChanges(value, _loginNodeId, Ps.Value.LoginNodeIdSelector); } } [DataMember] public int NoAccessNodeId { get { return _noAccessNodeId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _noAccessNodeId = value; - return _noAccessNodeId; - }, _noAccessNodeId, NoAccessNodeIdSelector); - } + set { _noAccessNodeId = SetPropertyValueAndDetectChanges(value, _noAccessNodeId, Ps.Value.NoAccessNodeIdSelector); } } [DataMember] public int ProtectedNodeId { get { return _protectedNodeId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _protectedNodeId = value; - return _protectedNodeId; - }, _protectedNodeId, ProtectedNodeIdSelector); - } + set { _protectedNodeId = SetPropertyValueAndDetectChanges(value, _protectedNodeId, Ps.Value.ProtectedNodeIdSelector); } } public override void ResetDirtyProperties(bool rememberPreviouslyChangedProperties) diff --git a/src/Umbraco.Core/Models/PublicAccessRule.cs b/src/Umbraco.Core/Models/PublicAccessRule.cs index c785d028d0..74939160a6 100644 --- a/src/Umbraco.Core/Models/PublicAccessRule.cs +++ b/src/Umbraco.Core/Models/PublicAccessRule.cs @@ -23,35 +23,26 @@ namespace Umbraco.Core.Models { } - private static readonly PropertyInfo RuleValueSelector = ExpressionHelper.GetPropertyInfo(x => x.RuleValue); - private static readonly PropertyInfo RuleTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.RuleType); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo RuleValueSelector = ExpressionHelper.GetPropertyInfo(x => x.RuleValue); + public readonly PropertyInfo RuleTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.RuleType); + } public Guid AccessEntryId { get; internal set; } public string RuleValue { get { return _ruleValue; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _ruleValue = value; - return _ruleValue; - }, _ruleValue, RuleValueSelector); - } + set { _ruleValue = SetPropertyValueAndDetectChanges(value, _ruleValue, Ps.Value.RuleValueSelector); } } public string RuleType { get { return _ruleType; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _ruleType = value; - return _ruleType; - }, _ruleType, RuleTypeSelector); - } + set { _ruleType = SetPropertyValueAndDetectChanges(value, _ruleType, Ps.Value.RuleTypeSelector); } } diff --git a/src/Umbraco.Core/Models/Relation.cs b/src/Umbraco.Core/Models/Relation.cs index f08e4b147e..9b593fd371 100644 --- a/src/Umbraco.Core/Models/Relation.cs +++ b/src/Umbraco.Core/Models/Relation.cs @@ -26,10 +26,15 @@ namespace Umbraco.Core.Models _relationType = relationType; } - private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); - private static readonly PropertyInfo ChildIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ChildId); - private static readonly PropertyInfo RelationTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.RelationType); - private static readonly PropertyInfo CommentSelector = ExpressionHelper.GetPropertyInfo(x => x.Comment); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); + public readonly PropertyInfo ChildIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ChildId); + public readonly PropertyInfo RelationTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.RelationType); + public readonly PropertyInfo CommentSelector = ExpressionHelper.GetPropertyInfo(x => x.Comment); + } /// /// Gets or sets the Parent Id of the Relation (Source) @@ -38,14 +43,7 @@ namespace Umbraco.Core.Models public int ParentId { get { return _parentId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _parentId = value; - return _parentId; - }, _parentId, ParentIdSelector); - } + set { _parentId = SetPropertyValueAndDetectChanges(value, _parentId, Ps.Value.ParentIdSelector); } } /// @@ -55,14 +53,7 @@ namespace Umbraco.Core.Models public int ChildId { get { return _childId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _childId = value; - return _childId; - }, _childId, ChildIdSelector); - } + set { _childId = SetPropertyValueAndDetectChanges(value, _childId, Ps.Value.ChildIdSelector); } } /// @@ -72,14 +63,7 @@ namespace Umbraco.Core.Models public IRelationType RelationType { get { return _relationType; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _relationType = value; - return _relationType; - }, _relationType, RelationTypeSelector); - } + set { _relationType = SetPropertyValueAndDetectChanges(value, _relationType, Ps.Value.RelationTypeSelector); } } /// @@ -89,14 +73,7 @@ namespace Umbraco.Core.Models public string Comment { get { return _comment; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _comment = value; - return _comment; - }, _comment, CommentSelector); - } + set { _comment = SetPropertyValueAndDetectChanges(value, _comment, Ps.Value.CommentSelector); } } /// diff --git a/src/Umbraco.Core/Models/RelationType.cs b/src/Umbraco.Core/Models/RelationType.cs index 5477628222..01d193bd16 100644 --- a/src/Umbraco.Core/Models/RelationType.cs +++ b/src/Umbraco.Core/Models/RelationType.cs @@ -35,11 +35,16 @@ namespace Umbraco.Core.Models Name = name; } - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); - private static readonly PropertyInfo IsBidirectionalSelector = ExpressionHelper.GetPropertyInfo(x => x.IsBidirectional); - private static readonly PropertyInfo ParentObjectTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentObjectType); - private static readonly PropertyInfo ChildObjectTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.ChildObjectType); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + public readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + public readonly PropertyInfo IsBidirectionalSelector = ExpressionHelper.GetPropertyInfo(x => x.IsBidirectional); + public readonly PropertyInfo ParentObjectTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentObjectType); + public readonly PropertyInfo ChildObjectTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.ChildObjectType); + } /// /// Gets or sets the Name of the RelationType @@ -48,14 +53,7 @@ namespace Umbraco.Core.Models public string Name { get { return _name; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _name = value; - return _name; - }, _name, NameSelector); - } + set { _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.NameSelector); } } /// @@ -65,14 +63,7 @@ namespace Umbraco.Core.Models public string Alias { get { return _alias; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _alias = value; - return _alias; - }, _alias, AliasSelector); - } + set { _alias = SetPropertyValueAndDetectChanges(value, _alias, Ps.Value.AliasSelector); } } /// @@ -82,14 +73,7 @@ namespace Umbraco.Core.Models public bool IsBidirectional { get { return _isBidrectional; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _isBidrectional = value; - return _isBidrectional; - }, _isBidrectional, IsBidirectionalSelector); - } + set { _isBidrectional = SetPropertyValueAndDetectChanges(value, _isBidrectional, Ps.Value.IsBidirectionalSelector); } } /// @@ -100,14 +84,7 @@ namespace Umbraco.Core.Models public Guid ParentObjectType { get { return _parentObjectType; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _parentObjectType = value; - return _parentObjectType; - }, _parentObjectType, ParentObjectTypeSelector); - } + set { _parentObjectType = SetPropertyValueAndDetectChanges(value, _parentObjectType, Ps.Value.ParentObjectTypeSelector); } } /// @@ -118,14 +95,7 @@ namespace Umbraco.Core.Models public Guid ChildObjectType { get { return _childObjectType; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _childObjectType = value; - return _childObjectType; - }, _childObjectType, ChildObjectTypeSelector); - } + set { _childObjectType = SetPropertyValueAndDetectChanges(value, _childObjectType, Ps.Value.ChildObjectTypeSelector); } } } diff --git a/src/Umbraco.Core/Models/ServerRegistration.cs b/src/Umbraco.Core/Models/ServerRegistration.cs index cee70893d0..f3758923d5 100644 --- a/src/Umbraco.Core/Models/ServerRegistration.cs +++ b/src/Umbraco.Core/Models/ServerRegistration.cs @@ -15,10 +15,15 @@ namespace Umbraco.Core.Models private bool _isActive; private bool _isMaster; - private static readonly PropertyInfo ServerAddressSelector = ExpressionHelper.GetPropertyInfo(x => x.ServerAddress); - private static readonly PropertyInfo ServerIdentitySelector = ExpressionHelper.GetPropertyInfo(x => x.ServerIdentity); - private static readonly PropertyInfo IsActiveSelector = ExpressionHelper.GetPropertyInfo(x => x.IsActive); - private static readonly PropertyInfo IsMasterSelector = ExpressionHelper.GetPropertyInfo(x => x.IsMaster); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo ServerAddressSelector = ExpressionHelper.GetPropertyInfo(x => x.ServerAddress); + public readonly PropertyInfo ServerIdentitySelector = ExpressionHelper.GetPropertyInfo(x => x.ServerIdentity); + public readonly PropertyInfo IsActiveSelector = ExpressionHelper.GetPropertyInfo(x => x.IsActive); + public readonly PropertyInfo IsMasterSelector = ExpressionHelper.GetPropertyInfo(x => x.IsMaster); + } /// /// Initialiazes a new instance of the class. @@ -69,14 +74,7 @@ namespace Umbraco.Core.Models public string ServerAddress { get { return _serverAddress; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _serverAddress = value; - return _serverAddress; - }, _serverAddress, ServerAddressSelector); - } + set { _serverAddress = SetPropertyValueAndDetectChanges(value, _serverAddress, Ps.Value.ServerAddressSelector); } } /// @@ -85,14 +83,7 @@ namespace Umbraco.Core.Models public string ServerIdentity { get { return _serverIdentity; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _serverIdentity = value; - return _serverIdentity; - }, _serverIdentity, ServerIdentitySelector); - } + set { _serverIdentity = SetPropertyValueAndDetectChanges(value, _serverIdentity, Ps.Value.ServerIdentitySelector); } } /// @@ -101,14 +92,7 @@ namespace Umbraco.Core.Models public bool IsActive { get { return _isActive; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _isActive = value; - return _isActive; - }, _isActive, IsActiveSelector); - } + set { _isActive = SetPropertyValueAndDetectChanges(value, _isActive, Ps.Value.IsActiveSelector); } } /// @@ -117,14 +101,7 @@ namespace Umbraco.Core.Models public bool IsMaster { get { return _isMaster; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _isMaster = value; - return _isMaster; - }, _isMaster, IsMasterSelector); - } + set { _isMaster = SetPropertyValueAndDetectChanges(value, _isMaster, Ps.Value.IsMasterSelector); } } /// diff --git a/src/Umbraco.Core/Models/StylesheetProperty.cs b/src/Umbraco.Core/Models/StylesheetProperty.cs index fead6f033a..992f210c2c 100644 --- a/src/Umbraco.Core/Models/StylesheetProperty.cs +++ b/src/Umbraco.Core/Models/StylesheetProperty.cs @@ -25,8 +25,13 @@ namespace Umbraco.Core.Models _value = value; } - private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); - private static readonly PropertyInfo ValueSelector = ExpressionHelper.GetPropertyInfo(x => x.Value); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + public readonly PropertyInfo ValueSelector = ExpressionHelper.GetPropertyInfo(x => x.Value); + } /// /// The CSS rule name that can be used by Umbraco in the back office @@ -39,14 +44,7 @@ namespace Umbraco.Core.Models public string Alias { get { return _alias; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _alias = value; - return _alias; - }, _alias, AliasSelector); - } + set { _alias = SetPropertyValueAndDetectChanges(value, _alias, Ps.Value.AliasSelector); } } /// @@ -55,14 +53,7 @@ namespace Umbraco.Core.Models public string Value { get { return _value; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _value = value; - return _value; - }, _value, ValueSelector); - } + set { _value = SetPropertyValueAndDetectChanges(value, _value, Ps.Value.ValueSelector); } } } diff --git a/src/Umbraco.Core/Models/Tag.cs b/src/Umbraco.Core/Models/Tag.cs index bfe4c10f42..58e2d0a810 100644 --- a/src/Umbraco.Core/Models/Tag.cs +++ b/src/Umbraco.Core/Models/Tag.cs @@ -27,35 +27,27 @@ namespace Umbraco.Core.Models NodeCount = nodeCount; } - private static readonly PropertyInfo TextSelector = ExpressionHelper.GetPropertyInfo(x => x.Text); - private static readonly PropertyInfo GroupSelector = ExpressionHelper.GetPropertyInfo(x => x.Group); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo TextSelector = ExpressionHelper.GetPropertyInfo(x => x.Text); + public readonly PropertyInfo GroupSelector = ExpressionHelper.GetPropertyInfo(x => x.Group); + } + private string _text; private string _group; public string Text { get { return _text; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _text = value; - return _text; - }, _text, TextSelector); - } + set { _text = SetPropertyValueAndDetectChanges(value, _text, Ps.Value.TextSelector); } } public string Group { get { return _group; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _group = value; - return _group; - }, _group, GroupSelector); - } + set { _group = SetPropertyValueAndDetectChanges(value, _group, Ps.Value.GroupSelector); } } public int NodeCount { get; internal set; } diff --git a/src/Umbraco.Core/Models/Task.cs b/src/Umbraco.Core/Models/Task.cs index 0f58814eea..a2fab9c1c1 100644 --- a/src/Umbraco.Core/Models/Task.cs +++ b/src/Umbraco.Core/Models/Task.cs @@ -24,12 +24,17 @@ namespace Umbraco.Core.Models _taskType = taskType; } - private static readonly PropertyInfo ClosedSelector = ExpressionHelper.GetPropertyInfo(x => x.Closed); - private static readonly PropertyInfo TaskTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.TaskType); - private static readonly PropertyInfo EntityIdSelector = ExpressionHelper.GetPropertyInfo(x => x.EntityId); - private static readonly PropertyInfo OwnerUserIdSelector = ExpressionHelper.GetPropertyInfo(x => x.OwnerUserId); - private static readonly PropertyInfo AssigneeUserIdSelector = ExpressionHelper.GetPropertyInfo(x => x.AssigneeUserId); - private static readonly PropertyInfo CommentSelector = ExpressionHelper.GetPropertyInfo(x => x.Comment); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo ClosedSelector = ExpressionHelper.GetPropertyInfo(x => x.Closed); + public readonly PropertyInfo TaskTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.TaskType); + public readonly PropertyInfo EntityIdSelector = ExpressionHelper.GetPropertyInfo(x => x.EntityId); + public readonly PropertyInfo OwnerUserIdSelector = ExpressionHelper.GetPropertyInfo(x => x.OwnerUserId); + public readonly PropertyInfo AssigneeUserIdSelector = ExpressionHelper.GetPropertyInfo(x => x.AssigneeUserId); + public readonly PropertyInfo CommentSelector = ExpressionHelper.GetPropertyInfo(x => x.Comment); + } /// /// Gets or sets a boolean indicating whether the task is closed @@ -38,14 +43,7 @@ namespace Umbraco.Core.Models public bool Closed { get { return _closed; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _closed = value; - return _closed; - }, _closed, ClosedSelector); - } + set { _closed = SetPropertyValueAndDetectChanges(value, _closed, Ps.Value.ClosedSelector); } } /// @@ -55,14 +53,7 @@ namespace Umbraco.Core.Models public TaskType TaskType { get { return _taskType; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _taskType = value; - return _taskType; - }, _taskType, TaskTypeSelector); - } + set { _taskType = SetPropertyValueAndDetectChanges(value, _taskType, Ps.Value.TaskTypeSelector); } } /// @@ -72,14 +63,7 @@ namespace Umbraco.Core.Models public int EntityId { get { return _entityId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _entityId = value; - return _entityId; - }, _entityId, EntityIdSelector); - } + set { _entityId = SetPropertyValueAndDetectChanges(value, _entityId, Ps.Value.EntityIdSelector); } } /// @@ -89,14 +73,7 @@ namespace Umbraco.Core.Models public int OwnerUserId { get { return _ownerUserId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _ownerUserId = value; - return _ownerUserId; - }, _ownerUserId, OwnerUserIdSelector); - } + set { _ownerUserId = SetPropertyValueAndDetectChanges(value, _ownerUserId, Ps.Value.OwnerUserIdSelector); } } /// @@ -106,14 +83,7 @@ namespace Umbraco.Core.Models public int AssigneeUserId { get { return _assigneeUserId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _assigneeUserId = value; - return _assigneeUserId; - }, _assigneeUserId, AssigneeUserIdSelector); - } + set { _assigneeUserId = SetPropertyValueAndDetectChanges(value, _assigneeUserId, Ps.Value.AssigneeUserIdSelector); } } /// @@ -123,14 +93,7 @@ namespace Umbraco.Core.Models public string Comment { get { return _comment; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _comment = value; - return _comment; - }, _comment, CommentSelector); - } + set { _comment = SetPropertyValueAndDetectChanges(value, _comment, Ps.Value.CommentSelector); } } } diff --git a/src/Umbraco.Core/Models/TaskType.cs b/src/Umbraco.Core/Models/TaskType.cs index 3f753f5ad9..70b0c572f6 100644 --- a/src/Umbraco.Core/Models/TaskType.cs +++ b/src/Umbraco.Core/Models/TaskType.cs @@ -19,7 +19,12 @@ namespace Umbraco.Core.Models _alias = alias; } - private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + } /// /// Gets or sets the Alias of the TaskType @@ -28,14 +33,7 @@ namespace Umbraco.Core.Models public string Alias { get { return _alias; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _alias = value; - return _alias; - }, _alias, AliasSelector); - } + set { _alias = SetPropertyValueAndDetectChanges(value, _alias, Ps.Value.AliasSelector); } } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Template.cs b/src/Umbraco.Core/Models/Template.cs index 1c8b44b674..f46ceee645 100644 --- a/src/Umbraco.Core/Models/Template.cs +++ b/src/Umbraco.Core/Models/Template.cs @@ -26,10 +26,15 @@ namespace Umbraco.Core.Models private string _masterTemplateAlias; private Lazy _masterTemplateId; - private static readonly PropertyInfo MasterTemplateAliasSelector = ExpressionHelper.GetPropertyInfo(x => x.MasterTemplateAlias); - private static readonly PropertyInfo MasterTemplateIdSelector = ExpressionHelper.GetPropertyInfo>(x => x.MasterTemplateId); - private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo MasterTemplateAliasSelector = ExpressionHelper.GetPropertyInfo(x => x.MasterTemplateAlias); + public readonly PropertyInfo MasterTemplateIdSelector = ExpressionHelper.GetPropertyInfo>(x => x.MasterTemplateId); + public readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + } public Template(string name, string alias) : this(name, alias, (Func) null) @@ -53,57 +58,27 @@ namespace Umbraco.Core.Models public Lazy MasterTemplateId { get { return _masterTemplateId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _masterTemplateId = value; - return _masterTemplateId; - }, _masterTemplateId, MasterTemplateIdSelector); - } + set { _masterTemplateId = SetPropertyValueAndDetectChanges(value, _masterTemplateId, Ps.Value.MasterTemplateIdSelector); } } public string MasterTemplateAlias { get { return _masterTemplateAlias; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _masterTemplateAlias = value; - return _masterTemplateAlias; - }, _masterTemplateAlias, MasterTemplateAliasSelector); - } + set { _masterTemplateAlias = SetPropertyValueAndDetectChanges(value, _masterTemplateAlias, Ps.Value.MasterTemplateAliasSelector); } } [DataMember] public new string Name { get { return _name; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _name = value; - return _name; - }, _name, NameSelector); - - } + set { _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.NameSelector); } } [DataMember] public new string Alias { get { return _alias; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _alias = value.ToCleanString(CleanStringType.UnderscoreAlias); - return _alias; - }, _alias, AliasSelector); - - } + set { _alias = SetPropertyValueAndDetectChanges(value.ToCleanString(CleanStringType.UnderscoreAlias), _alias, Ps.Value.AliasSelector); } } /// diff --git a/src/Umbraco.Core/Models/UmbracoDomain.cs b/src/Umbraco.Core/Models/UmbracoDomain.cs index 943f96c9f9..fc350df4a6 100644 --- a/src/Umbraco.Core/Models/UmbracoDomain.cs +++ b/src/Umbraco.Core/Models/UmbracoDomain.cs @@ -24,51 +24,34 @@ namespace Umbraco.Core.Models private int? _languageId; private string _domainName; - private static readonly PropertyInfo ContentSelector = ExpressionHelper.GetPropertyInfo(x => x.RootContentId); - private static readonly PropertyInfo DefaultLanguageSelector = ExpressionHelper.GetPropertyInfo(x => x.LanguageId); - private static readonly PropertyInfo DomainNameSelector = ExpressionHelper.GetPropertyInfo(x => x.DomainName); - + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo ContentSelector = ExpressionHelper.GetPropertyInfo(x => x.RootContentId); + public readonly PropertyInfo DefaultLanguageSelector = ExpressionHelper.GetPropertyInfo(x => x.LanguageId); + public readonly PropertyInfo DomainNameSelector = ExpressionHelper.GetPropertyInfo(x => x.DomainName); + } [DataMember] public int? LanguageId { get { return _languageId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _languageId = value; - return _languageId; - }, _languageId, DefaultLanguageSelector); - } + set { _languageId = SetPropertyValueAndDetectChanges(value, _languageId, Ps.Value.DefaultLanguageSelector); } } [DataMember] public string DomainName { get { return _domainName; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _domainName = value; - return _domainName; - }, _domainName, DomainNameSelector); - } + set { _domainName = SetPropertyValueAndDetectChanges(value, _domainName, Ps.Value.DomainNameSelector); } } [DataMember] public int? RootContentId { get { return _contentId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _contentId = value; - return _contentId; - }, _contentId, ContentSelector); - } + set { _contentId = SetPropertyValueAndDetectChanges(value, _contentId, Ps.Value.ContentSelector); } } public bool IsWildcard diff --git a/src/Umbraco.Core/Models/UmbracoEntity.cs b/src/Umbraco.Core/Models/UmbracoEntity.cs index 70ef056068..2a8b1791ae 100644 --- a/src/Umbraco.Core/Models/UmbracoEntity.cs +++ b/src/Umbraco.Core/Models/UmbracoEntity.cs @@ -26,22 +26,28 @@ namespace Umbraco.Core.Models private bool _hasPendingChanges; private string _contentTypeAlias; private Guid _nodeObjectTypeId; + + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); + public readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); + public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + public readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); + public readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); + public readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); + public readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); + public readonly PropertyInfo HasChildrenSelector = ExpressionHelper.GetPropertyInfo(x => x.HasChildren); + public readonly PropertyInfo IsPublishedSelector = ExpressionHelper.GetPropertyInfo(x => x.IsPublished); + public readonly PropertyInfo IsDraftSelector = ExpressionHelper.GetPropertyInfo(x => x.IsDraft); + public readonly PropertyInfo HasPendingChangesSelector = ExpressionHelper.GetPropertyInfo(x => x.HasPendingChanges); + public readonly PropertyInfo ContentTypeAliasSelector = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeAlias); + public readonly PropertyInfo ContentTypeIconSelector = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeIcon); + public readonly PropertyInfo ContentTypeThumbnailSelector = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeThumbnail); + public readonly PropertyInfo NodeObjectTypeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.NodeObjectTypeId); + } - private static readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); - private static readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); - private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); - private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); - private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); - private static readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); - private static readonly PropertyInfo HasChildrenSelector = ExpressionHelper.GetPropertyInfo(x => x.HasChildren); - private static readonly PropertyInfo IsPublishedSelector = ExpressionHelper.GetPropertyInfo(x => x.IsPublished); - private static readonly PropertyInfo IsDraftSelector = ExpressionHelper.GetPropertyInfo(x => x.IsDraft); - private static readonly PropertyInfo HasPendingChangesSelector = ExpressionHelper.GetPropertyInfo(x => x.HasPendingChanges); - private static readonly PropertyInfo ContentTypeAliasSelector = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeAlias); - private static readonly PropertyInfo ContentTypeIconSelector = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeIcon); - private static readonly PropertyInfo ContentTypeThumbnailSelector = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeThumbnail); - private static readonly PropertyInfo NodeObjectTypeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.NodeObjectTypeId); private string _contentTypeIcon; private string _contentTypeThumbnail; @@ -66,92 +72,43 @@ namespace Umbraco.Core.Models public int CreatorId { get { return _creatorId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _creatorId = value; - return _creatorId; - }, _creatorId, CreatorIdSelector); - } + set { _creatorId = SetPropertyValueAndDetectChanges(value, _creatorId, Ps.Value.CreatorIdSelector); } } public int Level { get { return _level; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _level = value; - return _level; - }, _level, LevelSelector); - } + set { _level = SetPropertyValueAndDetectChanges(value, _level, Ps.Value.LevelSelector); } } public string Name { get { return _name; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _name = value; - return _name; - }, _name, NameSelector); - } + set { _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.NameSelector); } } public int ParentId { get { return _parentId; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _parentId = value; - return _parentId; - }, _parentId, ParentIdSelector); - } + set { _parentId = SetPropertyValueAndDetectChanges(value, _parentId, Ps.Value.ParentIdSelector); } } public string Path { get { return _path; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _path = value; - return _path; - }, _path, PathSelector); - } + set { _path = SetPropertyValueAndDetectChanges(value, _path, Ps.Value.PathSelector); } } public int SortOrder { get { return _sortOrder; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _sortOrder = value; - return _sortOrder; - }, _sortOrder, SortOrderSelector); - } + set { _sortOrder = SetPropertyValueAndDetectChanges(value, _sortOrder, Ps.Value.SortOrderSelector); } } public bool Trashed { get { return _trashed; } - private set - { - SetPropertyValueAndDetectChanges(o => - { - _trashed = value; - return _trashed; - }, _trashed, TrashedSelector); - } + private set { _trashed = SetPropertyValueAndDetectChanges(value, _trashed, Ps.Value.TrashedSelector); } } public IDictionary AdditionalData { get; private set; } @@ -162,12 +119,7 @@ namespace Umbraco.Core.Models get { return _hasChildren; } set { - SetPropertyValueAndDetectChanges(o => - { - _hasChildren = value; - return _hasChildren; - }, _hasChildren, HasChildrenSelector); - + _hasChildren = SetPropertyValueAndDetectChanges(value, _hasChildren, Ps.Value.HasChildrenSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["HasChildren"] = value; } @@ -178,12 +130,7 @@ namespace Umbraco.Core.Models get { return _isPublished; } set { - SetPropertyValueAndDetectChanges(o => - { - _isPublished = value; - return _isPublished; - }, _isPublished, IsPublishedSelector); - + _isPublished = SetPropertyValueAndDetectChanges(value, _isPublished, Ps.Value.IsPublishedSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["IsPublished"] = value; } @@ -194,12 +141,7 @@ namespace Umbraco.Core.Models get { return _isDraft; } set { - SetPropertyValueAndDetectChanges(o => - { - _isDraft = value; - return _isDraft; - }, _isDraft, IsDraftSelector); - + _isDraft = SetPropertyValueAndDetectChanges(value, _isDraft, Ps.Value.IsDraftSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["IsDraft"] = value; } @@ -210,12 +152,7 @@ namespace Umbraco.Core.Models get { return _hasPendingChanges; } set { - SetPropertyValueAndDetectChanges(o => - { - _hasPendingChanges = value; - return _hasPendingChanges; - }, _hasPendingChanges, HasPendingChangesSelector); - + _hasPendingChanges = SetPropertyValueAndDetectChanges(value, _hasPendingChanges, Ps.Value.HasPendingChangesSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["HasPendingChanges"] = value; } @@ -226,12 +163,7 @@ namespace Umbraco.Core.Models get { return _contentTypeAlias; } set { - SetPropertyValueAndDetectChanges(o => - { - _contentTypeAlias = value; - return _contentTypeAlias; - }, _contentTypeAlias, ContentTypeAliasSelector); - + _contentTypeAlias = SetPropertyValueAndDetectChanges(value, _contentTypeAlias, Ps.Value.ContentTypeAliasSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["ContentTypeAlias"] = value; } @@ -242,12 +174,7 @@ namespace Umbraco.Core.Models get { return _contentTypeIcon; } set { - SetPropertyValueAndDetectChanges(o => - { - _contentTypeIcon = value; - return _contentTypeIcon; - }, _contentTypeIcon, ContentTypeIconSelector); - + _contentTypeIcon = SetPropertyValueAndDetectChanges(value, _contentTypeIcon, Ps.Value.ContentTypeIconSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["ContentTypeIcon"] = value; } @@ -258,12 +185,7 @@ namespace Umbraco.Core.Models get { return _contentTypeThumbnail; } set { - SetPropertyValueAndDetectChanges(o => - { - _contentTypeThumbnail = value; - return _contentTypeThumbnail; - }, _contentTypeThumbnail, ContentTypeThumbnailSelector); - + _contentTypeThumbnail = SetPropertyValueAndDetectChanges(value, _contentTypeThumbnail, Ps.Value.ContentTypeThumbnailSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["ContentTypeThumbnail"] = value; } @@ -274,12 +196,7 @@ namespace Umbraco.Core.Models get { return _nodeObjectTypeId; } set { - SetPropertyValueAndDetectChanges(o => - { - _nodeObjectTypeId = value; - return _nodeObjectTypeId; - }, _nodeObjectTypeId, NodeObjectTypeIdSelector); - + _nodeObjectTypeId = SetPropertyValueAndDetectChanges(value, _nodeObjectTypeId, Ps.Value.NodeObjectTypeIdSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["NodeObjectTypeId"] = value; } diff --git a/src/Umbraco.Tests/Cache/DeepCloneRuntimeCacheProviderTests.cs b/src/Umbraco.Tests/Cache/DeepCloneRuntimeCacheProviderTests.cs index 39e5dd2cb1..f43c0355a0 100644 --- a/src/Umbraco.Tests/Cache/DeepCloneRuntimeCacheProviderTests.cs +++ b/src/Umbraco.Tests/Cache/DeepCloneRuntimeCacheProviderTests.cs @@ -101,20 +101,18 @@ namespace Umbraco.Tests.Cache CloneId = Guid.NewGuid(); } - private static readonly PropertyInfo WriterSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + private static readonly Lazy Ps = new Lazy(); + + private class PropertySelectors + { + public readonly PropertyInfo WriterSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + } private string _name; public string Name { get { return _name; } - set - { - SetPropertyValueAndDetectChanges(o => - { - _name = value; - return _name; - }, _name, WriterSelector); - } + set { _name = SetPropertyValueAndDetectChanges(value, _name, Ps.Value.WriterSelector); } } public Guid CloneId { get; set; } diff --git a/src/Umbraco.Tests/Models/StylesheetTests.cs b/src/Umbraco.Tests/Models/StylesheetTests.cs index 21e339f54b..24c0b64c88 100644 --- a/src/Umbraco.Tests/Models/StylesheetTests.cs +++ b/src/Umbraco.Tests/Models/StylesheetTests.cs @@ -3,12 +3,19 @@ using System.Linq; using NUnit.Framework; using Umbraco.Core.Models; using Umbraco.Core.Serialization; +using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Models { [TestFixture] public class StylesheetTests { + [SetUp] + public virtual void Initialize() + { + SettingsForTests.Reset(); + } + [Test] public void Can_Create_Stylesheet() { @@ -55,7 +62,10 @@ namespace Umbraco.Tests.Models public void Can_Update_Property() { // Arrange - var stylesheet = new Stylesheet("/css/styles.css") { Content = @"body { color:#000; } /**umb_name:Hello*/p{font-size:2em;} .bold {font-weight:bold;}" }; + var stylesheet = new Stylesheet("/css/styles.css") + { + Content = @"body { color:#000; } /**umb_name:Hello*/p{font-size:2em;} .bold {font-weight:bold;}" + }; var prop = stylesheet.Properties.Single(); prop.Alias = "li";