From b5411a5402ac43ccf488ecec8a4c4286845146e0 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 21 Jun 2016 18:11:03 +0200 Subject: [PATCH] Initial commit of refactor of better/more efficient in terms of mem and performance properpty selectors for our models, this also yields a much cleaner syntax. I have discovered one issue now which is that the PropertyChanged event now fires before the property value is actually set, this is why the lambda syntax existed before. Instead we can use a ref property for the SetPropertyValueAndDetectChanges methods which will work much nicer - and also potentially have less allocations. --- src/Umbraco.Core/Models/Content.cs | 93 ++------- src/Umbraco.Core/Models/ContentBase.cs | 90 +++----- src/Umbraco.Core/Models/ContentType.cs | 24 +-- src/Umbraco.Core/Models/ContentTypeBase.cs | 166 ++++----------- .../Models/ContentTypeCompositionBase.cs | 2 +- src/Umbraco.Core/Models/DataTypeDefinition.cs | 96 +++------ src/Umbraco.Core/Models/DictionaryItem.cs | 49 ++--- .../Models/DictionaryTranslation.cs | 26 +-- src/Umbraco.Core/Models/EntityBase/Entity.cs | 76 ++----- .../EntityBase/TracksChangesEntityBase.cs | 40 ++-- src/Umbraco.Core/Models/File.cs | 24 +-- src/Umbraco.Core/Models/Language.cs | 27 +-- src/Umbraco.Core/Models/Macro.cs | 132 +++--------- src/Umbraco.Core/Models/MacroProperty.cs | 70 ++----- src/Umbraco.Core/Models/Member.cs | 49 ++--- src/Umbraco.Core/Models/MemberGroup.cs | 36 ++-- src/Umbraco.Core/Models/MemberType.cs | 19 +- src/Umbraco.Core/Models/Membership/User.cs | 195 ++++-------------- .../Models/Membership/UserType.cs | 35 ++-- src/Umbraco.Core/Models/MigrationEntry.cs | 28 +-- src/Umbraco.Core/Models/Property.cs | 72 +++---- src/Umbraco.Core/Models/PropertyGroup.cs | 32 ++- src/Umbraco.Core/Models/PropertyType.cs | 131 +++--------- src/Umbraco.Core/Models/PublicAccessEntry.cs | 42 ++-- src/Umbraco.Core/Models/PublicAccessRule.cs | 27 +-- src/Umbraco.Core/Models/Relation.cs | 49 ++--- src/Umbraco.Core/Models/RelationType.cs | 60 ++---- src/Umbraco.Core/Models/ServerRegistration.cs | 49 ++--- src/Umbraco.Core/Models/StylesheetProperty.cs | 27 +-- src/Umbraco.Core/Models/Tag.cs | 28 +-- src/Umbraco.Core/Models/Task.cs | 71 ++----- src/Umbraco.Core/Models/TaskType.cs | 16 +- src/Umbraco.Core/Models/Template.cs | 51 ++--- src/Umbraco.Core/Models/UmbracoDomain.cs | 39 +--- src/Umbraco.Core/Models/UmbracoEntity.cs | 155 ++++---------- .../DeepCloneRuntimeCacheProviderTests.cs | 16 +- src/Umbraco.Tests/Models/StylesheetTests.cs | 12 +- 37 files changed, 621 insertions(+), 1533 deletions(-) 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";